【发布时间】:2018-07-07 05:46:00
【问题描述】:
所以基本上我有一个从 firebase 检索数据的 Web 应用程序。由于查询需要时间,我在 javascript 中使用了 Promise,以便我的代码在正确的时间执行。在函数 getDataFirebase 中,从 firebase 检索数据并将其推送到名为 Collect 的数组。因此,在推送 1 行之后,它再次向 firebase 查询要收集的另一个数据表,然后继续循环。所以,我在调用 Firebase 之前创建了一个承诺,然后再解决。但是,我没有在 getDataUsers.once("value") 上这样做。在那里,我正在触发事件而不是等待它返回 - for 循环继续进行,所有回调都在稍后处理,但 resolve 位于 for 循环的末尾,所以到那时为时已晚。
我在查询时使用了 async 关键字,希望它会导致 for0loop 等待该作业完成,但实际上它在这里所做的只是导致回调返回一个 promise - 这是由 on 函数引入的。调试已经有一段时间了,希望它能在正确的时间填充执行。有人请帮帮我吗? :(((
var promise = getDataFirebase();
promise.then(function () {
console.log(Collect);
console.log("firsst");
return getDataFirebaseUser();
}).then(function () {
console.log("Second");
});
function getDataFirebase() {
return new Promise(function (resolve, reject) {
refReview.on("value", function (snap) {
var data = snap.val();
for (var key in data) {
Collect.push({
"RevieweeName": data[key].revieweeID.firstname.concat(" ", data[key].revieweeID.lastname),
"ReviewerName": data[key].reviewerID.firstname.concat(" ", data[key].reviewerID.lastname),
rating: data[key].rating,
content: data[key].content,
keyOfReviewee: data[key].revieweeID.userID
})
var getDataToUsers = firebase.database().ref("users").child(data[key].revieweeID.userID);
getDataToUsers.once("value", async function (snap) {
var fnLn = snap.val();
var first = fnLn.isTerminated;
console.log("terminateStatus", first);
});
}//end of for loop
resolve();
}); //end of snap
});
}
控制台根据代码输出如下:
Collect(array)
first
Second
terminateStatus, 1
一定是
Collect(array)
first
terminateStatus, 1
second
【问题讨论】:
标签: javascript jquery angularjs firebase firebase-realtime-database