Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我不能访问“一”中的父范围变量;然后";块,但我在后续块中有访问权限?_Javascript_Ember.js_Ecmascript 6_Es6 Promise - Fatal编程技术网

Javascript 为什么我不能访问“一”中的父范围变量;然后";块,但我在后续块中有访问权限?

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');

我正在为一个开源的Ember应用程序做贡献,我正在尝试将几个承诺链接在一起。下面代码的目的是将用户设置到PockDB存储的
当前用户
文档中,然后将其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'];