我有一个来自Firebase的实时数据库,数据存储在单个字符串中,而不是对象中。问题是foreach循环最后执行,因为它需要首先运行(我的意思是顺序的(。它在没有执行其工作的情况下从循环中出来。
exports.room_server = functions.database.ref(`/${Role.ROOM_REQUEST}/{room}`)
.onCreate((snapshot,context)=>{
// her ref.once is refrence to another node of database
ref.limttolast(3).once("value",function(snap){
snap.forEach(function (usr) {
adm = usr.val();
console.log("admin " + adm);
});
}).catch();
console.log(" cl " + adm);
});
// cl undefined is shown first
// then it comes
// admin abc
// admin you
// admin me
//result should be
//admin abc
//admin you
//admin me
//cl me
您将得到以下输出:
// cl undefined is shown first
// then it comes
// admin abc
// admin you
// admin me
因为once()
是异步的,这意味着它将在完成数据检索之前转移到另一个任务,所以首先执行console.log(" cl " + adm);
。
您可以执行以下操作:
ref.limitToLast(3).once("value").then((snapshot) => {
snapshot.forEach((usr) => {
adm = usr.val();
console.log(" cl " + adm);
console.log("admin " + adm);
});
}).catch((e) =>{
console.log(e);
});
then()
方法返回一个Promise
,当满足或拒绝Promise
时将调用它。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
上面给出的答案也会起作用,但这里有另一种方法。这将是几乎相同的。
ref.limttolast(3).once("value").then((snapshot) => {
snapshot.forEach((usr) => {
adm = usr.val();
console.log(" cl " + adm);
console.log("admin " + adm);
}); // end of foreach loop
return adm;
//return will wrap it as promise which will be fulfilled or rejected
// return will send it to next .then() method
})
.then( value_of_adm =>{
// value_of_adm = adm
console.log("cl" + value_of_adm);
})
.catch(
// enter your code here
// if u dont write code here no problem it will work fine
);