Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 用承诺抓住Firebase中Path的价值_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 用承诺抓住Firebase中Path的价值

Javascript 用承诺抓住Firebase中Path的价值,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我想获取Firebase中路径的值。说我喜欢 firebaseAuth.onAuthStateChanged(user => { var displayName = firebase.database() .ref('/users/' + user.uid + '/name/') .once('value').then(snapshot => snapshot.val()); store.dispatch('checkUser', {

我想获取Firebase中路径的值。说我喜欢

firebaseAuth.onAuthStateChanged(user => {
  var displayName = 
    firebase.database()
    .ref('/users/' + user.uid + '/name/')
    .once('value').then(snapshot => snapshot.val());

    store.dispatch('checkUser', {
        user
        displayName
    });
});
在我的控制台中,我得到了一个承诺,作为我的用户的值
displayName
,在这个承诺中我看到了正确的值,但是我该如何实现它呢?当我尝试在回调中将displayName设置为
snapshot.val()
时,它会抛出一个错误

为什么我不能这样做?在文档中似乎这是可能的


由于语法不正确而引发错误;需要将其封闭在一个块中:

.once('value').then(snapshot => { const displayName = snapshot.val(); });
然而,这并不能解决问题。您需要将
dispatch
调用移动到已解析快照的回调中:

firebaseAuth.onAuthStateChanged(user => {
  firebase.database()
    .ref('/users/' + user.uid + '/name/')
    .once('value').then(snapshot => store.dispatch('checkUser', {
      user
      displayName: snapshot.val()
    }));
});

看起来像是语法问题。箭头函数有一些带有括号等的有效配置,这些配置可能很难分类(在使用ES6一年后,它有时仍然会咬我)

这里有几个要考虑的有效版本。这不是可能的语法组合的详尽列表,但我发现它涵盖了我的大多数用例:

标准格式,多行块,括号。当您需要做的不仅仅是返回一个值(例如,
dispatch
)等副作用时,您可以使用此版本:

一行,箭头后的术语假定为返回值。在此版本中,右侧没有分配,并且没有
调度
调用:

  snapshot => snapshot.val()
在中间,多行用括号括起来,但仍然只有一个值假定为返回值:

snapshot => ({
      displayName:  snapshot.val()
    }) 
  // returns { displayName: "foo"  } 

它不可用的原因是您正在同步调用
store.dispatch
,。它在可用的
snapshot.val()
之前启动。您尝试将
dispatch
放入最后一个
Promise
的回调中是正确的。但是,您的问题中没有包含
错误
文本是不正确的,因为这可能是问题的根源。@Brandon我已经更新了问题。谢谢。Firebase身份验证子系统将存储显示名称、用户名、imageUrl等所有信息。。。但是,您不能通过他们的GUI查看它。您只需请求currentUser属性。请参阅@RonRoyston,我正在使用电子邮件和密码注册,因此当用户创建我不相信的帐户时,我不会自动获得displayName属性。@staxwell True,对。我已经有一段时间没有使用它了,但我记得您实际上可以将displayName直接设置到Firebase auth子系统中。但你必须捕捉它。我希望我说的有道理……这是有道理的。谢谢
snapshot => ({
      displayName:  snapshot.val()
    }) 
  // returns { displayName: "foo"  }