Firebase 在 Promise 触发前等待加载数据库数据

Posted

技术标签:

【中文标题】Firebase 在 Promise 触发前等待加载数据库数据【英文标题】:Firebase waiting to load database data before promise fires 【发布时间】:2017-07-20 03:27:07 【问题描述】:

有人可以用我的代码解释如何在 Firebase 中使用 Promise:

        var p = new Promise(function(resolve, reject) 
            var data=null;

            var ref = db.ref("/");
            ref.once("value", function(snapshot) 
                data = snapshot.val();

            );

            data.onload = function() 
                console.log(data+" onload");

                if (data!=null) 
                    resolve('Success!');
                
                else 
                    reject('Failure!');
                    console.log('failed');
                

            

        );

        p.then(function()  
            /* do something with the result */
            console.log(data+" done");
        ).catch(function() 
            /* error :( */
            console.log("error");
        );

我想等到收到data = snapshot.val(); 的“回音”,然后再调用我的下一个函数。这样做的正确方法是什么?我显然不理解承诺。我正在尝试关注this 教程。

【问题讨论】:

查看您的代码,这是您需要重温的firebase!忽略promise代码,其余代码看起来完全错误 我的意思是,您的var p 可以简单地是var p = db.ref("/").once("value"); - 因为once 返回一个承诺! ...然后是p.then(function(result) ... do something with the result ...) 【参考方案1】:

Promises 直接内置在 firebase 中。

var ref = firebase.database().ref();

ref.once('value')
  .then(function (result) 
    // This only happens after the data has been returned
    console.log(result.val());
  )
  .catch(function (err) 
    // This is where errors land
    console.log('Error', err.code);
  );

第 3 版的 firebase 已为您服务,因此您无需创建容器承诺。 :)

【讨论】:

以上是关于Firebase 在 Promise 触发前等待加载数据库数据的主要内容,如果未能解决你的问题,请参考以下文章

让 promise 在返回前等待几秒钟

等待所有 firebase 调用使用 map 函数完成

async-await 同时触发(等待)多个异步操作

Firebase 云函数错误:函数返回未定义、预期的 Promise 或值

必须在 Firebase CLI 数据请求中适当处理 Promise

在 Firebase Cloud Functions 上使用带有 PDFMake 的 Promise