Firebase 查询后返回 Promise

Posted

技术标签:

【中文标题】Firebase 查询后返回 Promise【英文标题】:Returning Promise after Firebase Query 【发布时间】: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”循环完全解决。

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于Firebase 查询后返回 Promise的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 查询未从数据库返回任何结果

在 Firebase 中查询现有节点返回 null

无法从 firebase Stream 查询返回对象列表

如何从 Firebase 存储下载 URL 中删除查询字符串

Firebase查询:“where”子句不起作用,继续返回所有文档

Firebase 在函数返回后检索数据