下面的代码是作为firebase函数上传的。每当我使用firebase函数:log检查日志时,我都可以看到expoTokens数组是空的。
var expoTokens = [];
db.collection('members').get()
.then(docs => {
var data = []
docs.forEach(doc => {
if (recipients.includes(doc.id)) {
doc.data().expoTokens.forEach(token => {
if (!data.includes(token)) data.push(token);
})
}
})
return Promise.all(data);
})
.then((data) => {
expoTokens = data;
})
console.log("expoTokens");
console.log(expoTokens);
我只需要获得一个ExpoTokens数组,这样我就可以发送通知
我建议使用asyc/await
来使代码流更加清晰。你的函数可以这样写:
var expoTokens = [];
const docs = await db.collection("members").get();
var data = [];
docs.forEach((doc) => {
if (recipients.includes(doc.id)) {
doc.data().expoTokens.forEach((token) => {
if (!data.includes(token)) expoTokens.push(token);
});
}
});
console.log("expoTokens");
console.log(expoTokens);
// TO DO
// Send notifications using expoTokens using await
// We return to let the cloud function know that we are done
return;
只是不要忘记像async (snap, context) => {}
一样在您的函数中使用async
您的console.log(expoTokens);
发生在expoTokens = data;
运行之前。
参见:
- 无法在循环中添加谷歌标记
- NodeJS,Firestore获取字段
- 为什么Firebase在once((函数外失去引用
- 等待forEach完成,然后从我的承诺/功能返回
如果您想从云功能中返回expo令牌,请从then
内部向上并从主功能中返回:
return db.collection('members').get().then(docs => {
var data = []
docs.forEach(doc => {
if (recipients.includes(doc.id)) {
doc.data().expoTokens.forEach(token => {
if (!data.includes(token)) data.push(token);
})
}
})
return Promise.all(data);
})