Firebase查询后返回承诺

时间:2016-12-21 22:07:57

标签: javascript firebase promise firebase-realtime-database

尝试将其作为一般用途,以便它可以帮助其他人。这个问题让我更多地与承诺的概念作斗争。

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

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

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

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

1 个答案:

答案 0 :(得分:8)

我认为 File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 8, in <module> class User(db.Model): File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 10, in User id = db.Column(sqlalchemy.dialects.mysql.INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False) File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 254, in __init__ super(INTEGER, self).__init__(display_width=display_width, **kw) File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 54, in __init__ super(_IntegerType, self).__init__(**kw) File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 24, in __init__ super(_NumericType, self).__init__(**kw) TypeError: object.__init__() takes no parameters 应该返回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();
      });
  });
}

这是一个简单的工作example