javascript - 为什么javascript es6解构未定义?
问题描述
我在写vuex,喜欢解构语法,但是下面的语法有错误。解构变量未定义,正常变量输出良好。是什么原因?
[GET_BUSINESS_INFO]: async ({ commit, rootState }) => {
const { user: { firstBranchId = '' } = {} } = rootState || {};
console.log('GET_BUSINESS_INFO', rootState.user.firstBranchId);
// undefined
console.log('GET_BUSINESS_INFO', firstBranchId);
// 1
},
解决方案
除非rootState
orrootState.user
是代理,或者rootState.user
orrootState.user.firstBranchId
属性是具有副作用的访问器属性(两者都不太可能),否则您展示的代码不可能按照您所说的那样做。唯一合理的解释是,在完成解构的位置和完成日志记录的位置之间存在一些改变rootState
. 该更改将由您的 first 显示console.log
,但不会由您的 second 显示,因为rootState
在解构之后更改不会对firstBranchId
. 在解构和日志记录之间有些东西。它可能是您正在调用的同步函数,也可能是await
导致async
rootState
函数暂停并允许其他地方的其他代码在您等待承诺时运行修改。
async
这是该场景的示例:
const example = async ({ commit, rootState }) => {
const { user: { firstBranchId = '' } = {} } = rootState || {};
await something();
console.log('GET_BUSINESS_INFO', rootState.user.firstBranchId); // undefined
console.log('GET_BUSINESS_INFO', firstBranchId); // 1
};
function something() {
return new Promise(resolve => setTimeout(resolve, 10));
}
const obj = {
rootState: {
user: {
firstBranchId: 1,
},
},
};
const p = example(obj);
obj.rootState.user = {}; // This happens while awaiting `something()`
p.then(() => {
console.log("Done");
});
您必须查看解构和日志记录之间的任何代码,以找出rootState
修改的原因/位置/方式。
推荐阅读
- php - 谷歌电子表格值获取方法中的错误 500
- javascript - setstate 没有将值设置为状态
- java - Firestore 计算数据的次数?
- python - 从 Pandas-DataReader 重新排列索引、行和列
- c++ - 通过引用捕获与移动,Lambdas
- sql - 如何使用 LINQPad 使用日期进行查询
- c++ - 函数描述与 C++ 参考上的可能实现
- r - 通过 Amazon Web Services (AWS) 上传 Shiny 应用程序
- html - 如何根据Angular 7中[ngStyle]的值在1个单元格中划分背景?
- c# - 如何限制多个长时间运行的操作的并行性