如何对firebase进行异步调用?

时间:2018-01-28 20:41:24

标签: javascript reactjs firebase asynchronous firebase-realtime-database

我正在努力从firebase中检索数据。基本上我正在创建一个约会应用程序,当用户“喜欢”某人时,它应该检查显示的用户喜欢的人数组,以查看当前用户是否在那里,然后如果他们是“匹配”他们

我有这个功能:

  pullFromFirebase = (displayedUser) => {
    return new Promise((resolve, reject) => {
      firebase.database().ref('users/' + displayedUser.id + '/usersLiked/').once('value').then(function(snapshot) {
        const users = Object.keys(snapshot.val()).map(function(key) {
          return snapshot.val()[key];
        })
      });
    })
  }

这个功能正常,当我在console.log(用户)时,我得到了喜欢的人的数组。但是,当我这样称呼这个函数时

 async checkForMatch (currentUser, displayedUser) {
    const likedUsers = await this.pullFromFirebase(displayedUser);
    console.log(likedUsers, 'likedUsers');
  }

控制台中没有记录任何内容?当我拿走异步的东西时,console.log只是说它正在等待。我做错了什么或为什么我的checkformatch函数中没有显示用户?

2 个答案:

答案 0 :(得分:4)

您从未在pullFromFirebase方法

中解决您的承诺

结帐代码

pullFromFirebase = (displayedUser) => 
{
    return new Promise((resolve, reject) => 
    {
        firebase.database().ref('users/' + displayedUser.id + '/usersLiked/').once('value').then(function (snapshot) 
        {
            const users = Object.keys(snapshot.val()).map(function (key) {
                return snapshot.val()[key];
            })

            resolve(users);  // <--- here is the fix
        });
    })
}

答案 1 :(得分:0)

你可能在那里不必要地添加了一个Promise,你的函数返回一个永远无法解析的Promise。 users已经返回了承诺,但您还需要返回.then()内的pullFromFirebase = (displayedUser) => { return firebase.database().ref('users/' + displayedUser.id + '/usersLiked/').once('value').then(function(snapshot) { const users = Object.keys(snapshot.val()).map(function(key) { return snapshot.val()[key]; }); return users; }); }

pullFromFirebase = (displayedUser) => {
    return new Promise((resolve, reject) => {
      firebase.database().ref('users/' + displayedUser.id + '/usersLiked/').once('value').then(function(snapshot) {
        const users = Object.keys(snapshot.val()).map(function(key) {
          return snapshot.val()[key];
        })
        resolve(users);
      });
    })
  }

或者,如果您需要包装Promise,则需要使用返回值来解决它:

<div class="form-row form-group">
  <div class="col-sm-2">{{form.author.label}}{% if form.author.flags.required %}*{% endif %}</div> 
  <div class="col-auto">{{form.author(class="form-control",size=40)}}</div>
</div>

<div class="form-row form-group">
  <div class="col-sm-2">{{form.title.label}}{% if form.title.flags.required %}*{% endif %}</div> 
  <div class="col-auto">{{form.title(class="form-control",size=60)}}</div>
</div>