我在 firebase 函数上运行时得到一个空数组,但在手机上的 react native expo 上运行时得到一个带有值的数组



下面的代码是作为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);
})

最新更新