【问题标题】:how to make an async call to firebase?如何对firebase进行异步调用?
【发布时间】:2018-07-07 13:07:14
【问题描述】:

我正在努力从 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(users) 时,我得到了被喜欢的人的数组。但是,当我这样调用这个函数时

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

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

【问题讨论】:

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


    【解决方案1】:

    你从未在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
            });
        })
    }
    

    【讨论】:

    • @TheWalrus 很乐意为您提供帮助 :)
    【解决方案2】:

    你可能不必要地在那里添加了一个 Promise,而你的函数返回一个永远不会解析的 Promise。 firebase.database 已经返回了一个 Promise,但您还需要返回您在 .then() 中获得的 users

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多