【问题标题】:How do i get callback in firebase nested forEach如何在嵌套的 forEach 中获取回调
【发布时间】:2017-01-13 12:50:45
【问题描述】:

在回调中获取空值.. 即使我在控制台console.log(list) 中获得价值。

但我希望 finallist 之后所有 forEach 操作完成并且所有 csnap.key 推送到 list

var list = [];
var mkeys = ['-Ka2D86jpdjKpTf2-Nmf', '-KaCPtlIoPX34ltMPqs3'];

   function Getumanes(msgkeys,callback) {
    msgkeys.forEach(function (key) {
        var msgstref = firebase.database().ref("Msgtemplate/" + key + '/Actionusers');
        msgstref.orderByChild('status').equalTo(true).limitToFirst(2).once('value').then(function (snap) {
            snap.forEach(function (csnap) {
                list.push(csnap.key);
            })
            console.log(list);
        })
    })
    callback(list)
}

Getumanes(mkeys, function (finallist) {
    console.log("finallist: " + finallist);
});

【问题讨论】:

  • Firebase 倾向于异步收集数据,因此您可能会在列表填充之前将其发送到控制台。您需要等到异步回调完成后才能使用list
  • Thanx @Alex,你能详细说明我怎样才能做到这一点吗?通过一段代码
  • 基本上这个值是在回调内部计算出来的,回调在console.log(list)之后执行,这意味着list为空。如果您在回调中使用 console.log,您将看到数据。这就是异步请求的工作方式。它们被调用,其余代码运行,当请求完成时,回调运行。

标签: jquery asynchronous firebase firebase-realtime-database


【解决方案1】:

在访问 Firebase 数据库(以及几乎所有现代网络/云 API)时,对后端的调用是异步发生的。在加载数据时,main 方法中的代码会继续执行,而不是等待数据加载。然后在加载数据时,调用你的回调函数。

解决这个问题的最简单方法是重新定义您的问题。与其考虑“先获取数据,然后打印数据”,不如将其视为“开始加载数据,然后当数据可用时,打印它”。在代码中,这转化为移动逻辑以将数据打印回调:

mkeys.forEach(function (key) {
    var msgstref = firebase.database().ref("Msgtemplate/" + key + '/Actionusers');
    msgstref.orderByChild('status').equalTo(true).limitToFirst(2).once('value').then(function (snap) {
        snap.forEach(function (csnap) {
            list.push(csnap.key);
        })
        console.log(list);
    })
})

当然,这段代码中的console.log 也可以是其他任何东西。

这个问题之前已经讨论过很多,无论是对于 Firebase 还是对于一般的 Web 编程。我建议您研究其中的一些问题和答案,以掌握异步 Web API 的概念:

正如我所说...这是一个常见问题。 :-)

【讨论】:

  • 非常感谢@Frank van Puffelen,但我只想要最后一个数组作为我的结果,但目前我正在接收两个数组,因为我有两个来自外部 forEach 的值,如果可以的话,这将非常有帮助给点建议吧..
【解决方案2】:

改变你的列表 FROM var list = []; TO 列表:FirebaseListObservable;

然后在调用方法中订阅返回此列表的函数,这样即使在 UI 中,元素也会相应地更新。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2018-02-17
    • 2013-09-04
    • 1970-01-01
    • 2019-09-13
    • 2019-05-18
    • 2017-03-17
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多