Firebase查询后返回承诺

Joe*_*cio 4 javascript promise firebase 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
    })
}
Run Code Online (Sandbox Code Playgroud)

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

adr*_*727 10

我认为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();
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话:

CheckIfFriendsPending(id2)
  .then(function() { console.log('Yes'); })
  .catch(function() { console.log('No'); });
Run Code Online (Sandbox Code Playgroud)

这是一个简单的工作示例.