用承诺抓住Firebase中路径的价值

时间:2017-01-07 21:22:07

标签: 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', {
        user
        displayName
    });
});

在我的控制台中,我得到了一个承诺作为我的用户displayName的价值,其中我看到了正确的值,但我该怎么做呢?当我尝试在回调中将displayName设置为snapshot.val()时,它会抛出一个错误。

enter image description here

enter image description here

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

enter image description here

2 个答案:

答案 0 :(得分:1)

抛出错误,因为语法不正确;它需要被包含在一个块中:

.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()
    }));
});

答案 1 :(得分:1)

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

这是一些需要考虑的有效版本。这不是可能的语法组合的详尽列表,但我发现它涵盖了我的大部分用例:

标准表格,多行块,括号。这是您在有更多操作时使用的版本,而不仅仅是返回一个值(例如dispatch等副作用):

(snapshot) => { 
    const displayname = snapshot. val()
    // then you'd dispatch here
     return
 } 

一个班轮,箭头后面的术语被假定为返回值。此版本中右侧没有分配,也没有dispatch来电:

  snapshot => snapshot.val()

中间,括号括起来的多行,但仍然只有一个假定为返回值的值:

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