Javascript 为什么我不能访问“一”中的父范围变量;然后";块,但我在后续块中有访问权限?
我正在为一个开源的Ember应用程序做贡献,我正在尝试将几个承诺链接在一起。下面代码的目的是将用户设置到PockDB存储的Javascript 为什么我不能访问“一”中的父范围变量;然后";块,但我在后续块中有访问权限?,javascript,ember.js,ecmascript-6,es6-promise,Javascript,Ember.js,Ecmascript 6,Es6 Promise,我正在为一个开源的Ember应用程序做贡献,我正在尝试将几个承诺链接在一起。下面代码的目的是将用户设置到PockDB存储的当前用户文档中,然后将其i18n首选项设置到首选项存储中。代码如下: setCurrentUser(userName) { // block 0 let config = this.get('configDB'); let sessionData = this.get('sessionData');
当前用户
文档中,然后将其i18n首选项设置到首选项
存储中。代码如下:
setCurrentUser(userName) { // block 0
let config = this.get('configDB');
let sessionData = this.get('sessionData');
if (!userName && sessionData.authenticated) {
userName = sessionData.authenticated.name;
}
config.get('current_user').then((doc) => { // block 1
doc.value = userName;
config.put(doc);
return userName;
}).then((user) => { // block 2
let configDB = this.get('configDB');
let preferences = configDB.get('preferences');
let promises = { user, preferences };
return RSVP.hash(promises);
}).then((promises) => { // block 3
let { preferences } = promises;
let userName = promises.user.name || 'default';
this.set('i18n.locale', preferences[userName].i18n);
}).catch((err) => { // block 4
console.log(err);
config.put({_id: 'current_user', value: userName});
});
}
如您所见,userName
变量作为参数传递给setCurrentUser
方法。因此,我希望能够在每个然后块中的每个代码块中访问此参数
但事实并非如此。我确实可以在块0、1、3中访问它,甚至在块4中的catch
范围内。但由于某种原因,我在第二区没有权限访问它。上面的代码,特别是带有preferences文档和user对象的RSVP对象的传递,代表了一种使我的代码正常工作的黑客解决方法。但是,我更喜欢这样做:
setCurrentUser(userName) { // block 0
let config = this.get('configDB');
let sessionData = this.get('sessionData');
if (!userName && sessionData.authenticated) {
userName = sessionData.authenticated.name;
}
config.get('current_user').then((doc) => { // block 1
doc.value = userName;
config.put(doc);
return userName;
}).then((user) => { // block 2
let configDB = this.get('configDB');
let preferences = configDB.get('preferences');
return preferences[userName].i18n || preferences['default'].i18n;
}).then((i18nPreference) => { // block 3
this.set('i18n.locale', i18nPreference);
}).catch((err) => { // block 4
console.log(err);
config.put({_id: 'current_user', value: userName});
});
}
事实上,我已经尝试了上面的方法,但是我得到了uncaughtreferenceerror:userName未在块2中定义,因此被路由到catch
块
我的问题是,块0/1/3/4和块2之间的区别是什么,这将允许第一个块访问userName
,但会阻止块2这样做?从我所看到的,userName在代码中没有大写N(因此它是一个不同的变量):
您说此代码仅用于说明目的。最好知道返回错误消息的实际代码是什么,以便更好地了解情况。我有疑问,您返回的是用户名
,我们可以输入。)然后((用户)=>{
从那里开始?这样行吗?@kumkanillam我不明白你的意思。你的意思是删除行返回用户名;
并简单地移动})。然后((用户)=>{
上一行?然后我们将传递什么到下一行然后
阻止?忽略我的评论,这是我对承诺的误解。对我来说,你的代码看起来不错。可以尝试注释这一行doc.value=userName;config.put(doc);
你需要将你的代码简化为一个可复制的例子。事实上,你完全可以在所有的块中访问该变量:是否有可能调用setCurrentUser
时没有userName
而该块仅仅是你出错的第一个地方?我所说的说明性目的
是在这里,您引用的代码基本上是伪代码,但是我用一个我尝试过的特定示例更新了示例代码,但失败了。我在块2中得到的错误返回了我在问题中提到的错误(即未捕获引用错误:未定义用户名
)。
}).then((user) => {
let configDB = this.get('configDB');
let preferences = configDB.get('preferences');
return preferences[username] || preferences['default'];