【问题标题】:Returning Promise after Firebase QueryFirebase 查询后返回 Promise
【发布时间】:2017-05-07 11:09:11
【问题描述】:

试图将其概括为通用的,以便对其他人有所帮助。这个问题让我更加纠结于承诺的概念。

所以我有一个返回布尔变量值的函数。我的想法是从 Firebase 中提取一些数据,然后循环遍历这些值……然后将变量设置为 true(如果找到)。

我遇到的问题是,无论 ForEach 循环和查询是否完成,都会返回该值。我尝试使用某种承诺解析(在下面的代码片段中)正确返回它

export function CheckIfFriendsPending(id2){
    var userID = getFirebase().auth().currentUser.uid
    var indicator = false

     var retri = function()
    {   
           getFirebase().database().ref('members/' + userID + '/PendingFR').once('value').then(function(snap) {
                    console.log("~~~~~~~~~~~~~~~~~~go")

                    //if(result.hasOwnProperty('install_type'))
                    snap.forEach(function(childSnapshot) {

                        var childObject = childSnapshot.val()
                        if(childObject.hasOwnProperty('From')){
                            alert("OKAY")
                            if(childObject.From == userID && childObject.To == id2){
                                indicator = true
                            } else if(childObject.From == id2 && childObject.To == userID){
                                indicator = true

                            }
                        }

                    });


                })                          
    } // end retri

    Promise.all(retri).then(function() {
        return indicator
    })
}

有人知道如何解决这个问题吗?我想一个总结版本的问题是如何在一个已经返回一个承诺的函数中创建一个承诺(我相信 firebase 数据库查询会这样做)。我想它也必须等待“ForEach”循环完全解决。

【问题讨论】:

    标签: javascript firebase promise firebase-realtime-database


    【解决方案1】:

    我认为CheckIfFriendsPending 应该返回一个Promise

    export function CheckIfFriendsPending(id2) {
      return new Promise(function (resolve, reject) {
        var userID = getFirebase().auth().currentUser.uid;
        var indicator = false;
        getFirebase().database().ref('members/' + userID + '/PendingFR').once('value')
          .then(function (snap) {
            function userMatch(user) {
              if (!!user.From && user.From === userID && (user.To === id2 || user.To === userID)) {
                return resolve();
              }
            }
            snap.forEach(function (childSnapshot) {
              var childObject = childSnapshot.val();
              userMatch(childObject);
            });
            return reject();
          });
      });
    }
    

    然后你可以调用:

    CheckIfFriendsPending(id2)
      .then(function() { console.log('Yes'); })
      .catch(function() { console.log('No'); });
    

    这是一个简单的工作example

    【讨论】:

      猜你喜欢
      • 2017-11-06
      • 2019-04-16
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多