Javascript 如何使Firebase消息传递功能异步
我有一个firebase消息传递函数,但返回函数似乎比其他函数先执行。以下是代码(抱歉,太长了):Javascript 如何使Firebase消息传递功能异步,javascript,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,我有一个firebase消息传递函数,但返回函数似乎比其他函数先执行。以下是代码(抱歉,太长了): 我认为问题在于forEach不是异步的,所以最后一行代码是在等待forEach完成之前执行的。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:forEach似乎不遵守async指令。我不得不用来。。。在…语法中: 让它遵守异步(从父范围) 按顺序处理,因为当时顺序对我很重要 在您的情况下,它可能看起来像(收件人中的const recipient){…} 显然,这是由forEach在
我认为问题在于forEach不是异步的,所以最后一行代码是在等待forEach完成之前执行的。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:
forEach
似乎不遵守async
指令。我不得不用来。。。在…
语法中:
异步(从父范围)
显然,这是由
forEach
在不等待响应的情况下调用每个项的回调引起的。即使回调是异步的,forEach
也不知道在每个循环上等待它的响应
资料来源:
上面链接的博客上的解决方案:
await Promise.all(
Object.keys(recipients).map(async recipient => {
const devicesRef = db
.collection('devices')
.where('userId', '==', recipient);
const devices = await devicesRef.get();
devices.forEach(res => {
const token: string = res.data().token;
console.log(token);
tokens.push(token);
});
});
)
注意,
forEach
已被一个map
替换,它在承诺范围内。所有(…)
。我最近在什么地方遇到了这个问题。你是对的,至少以我的经验来看:forEach
似乎不遵守async
指令。我不得不用来。。。在…
语法中:
异步(从父范围)
显然,这是由
forEach
在不等待响应的情况下调用每个项的回调引起的。即使回调是异步的,forEach
也不知道在每个循环上等待它的响应
资料来源:
上面链接的博客上的解决方案:
await Promise.all(
Object.keys(recipients).map(async recipient => {
const devicesRef = db
.collection('devices')
.where('userId', '==', recipient);
const devices = await devicesRef.get();
devices.forEach(res => {
const token: string = res.data().token;
console.log(token);
tokens.push(token);
});
});
)
注意,
forEach
已被一个map
替换,它在承诺范围内。所有(…)
底线是您应该将所有承诺收集到一个数组中,然后使用Promise.all等待整个批处理。底线是您应该将所有承诺收集到一个数组中,然后使用Promise.all等待整个批处理。forEach并不是真正的“幼稚”。这就是lambda函数在JS中进行函数编程时的工作方式。谢谢Brian,现在它可以完美地工作了。我只需要去掉最后一个分号,因为TS抱怨Foreach并不是真的“幼稚”。这就是lambda函数在JS中进行函数编程时的工作方式。谢谢Brian,现在它可以完美地工作了。我只需要去掉最后一个分号,因为TS在抱怨