Firebase 数组中的加法分配问题
Trouble with Addition Assignment in Array from Firebase
我有一个场景,我需要一次查询多个集合并根据集合名称检索值。我使用 Promise.all 这样做,它会像这样工作
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("collection1").where("user_id", "==", uid).get(),
admin.firestore().collection("collection2").where("user_id", "==", uid).get(),
admin.firestore().collection("collection3").where("user_id", "==", uid).get(),
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "collection1") {
qs.docs.map((doc) => {
valuesArr1.push(doc.data().arr);
});
} else if (qs.query._queryOptions.collectionId == "Collection2") {
qs.docs.map((doc) => {
valuesArr2.push(doc.data());
});
} else if (qs.query._queryOptions.collectionId == "collection3") {
qs.docs.map((doc) => {
valuesArr3.push(doc.data());
});
}
} else {
return
}
});
for (var i=0; i < valuesArr1.length; i++) {
if (valuesArr1[i].desiredData) {
console.log('datas from for loop on datas array', valuesArr1[i].desiredData)
globalVariable += `<img src="${valuesArr1[i].desiredData}">`;
}
}
执行此操作后,我会映射我获得的查询快照,并且能够像这样检索到目前为止的值
从第一个集合中,我从 firestore 文档中检索了一个数组,然后我只从集合中检索了以下集合中的所有文档。这都是 'works',因为当我 console.log 进入功能控制台时,数据显示完全符合预期。只有当我想遍历数据并将结果分配给全局变量以在其他地方使用时,才会出现奇怪的行为。
console.log 在函数控制台中显示所需的数据没有问题,但是当我将该数据插入 html 并在 nodemailer 中发送时的输出我得到以下结果
当我使用 += 加法赋值运算符时,undefined 始终是响应中的第一个,但是如果我只使用 = 赋值运算符,则没有 undefined 但我显然没有得到我期望的所有数据。
我正在检索的集合中没有未定义的值或文档,我已经彻底检查并删除了文档以确保这一点。经过几天的研究,我得出的结论是它与我正在使用的承诺的异步性质有关,并且在我迭代它时数据没有立即准备好。
有人可以帮助我了解我做错了什么以及如何在节点中修复它吗?
我找到了解决我的问题的方法并想分享它,希望它能为未来的观众节省一些时间。
之前,我将来自 Firebase 的数组结果存储在一个全局变量中。为了省去一些麻烦,我会 post 下面再写一遍代码。
var globalVariableArray = []
var globalVariable
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "DataCollection") {
Promise.all(
qs.docs.map(doc => {
globalVariableArray = doc.data().arrayWithDesiredData;
})
);
}
else {
return
}
});
globalVariableArray.map(gv => {
globalVariable += `<p>gv.desiredData</p>` // <--- Right here is where the problem area was
})
var mailOptions = {
from: foo@blurdybloop.com,
to: 'bar@blurdybloop.com
subject: 'Almost but not quite',
html: `${globalVariable}`
};
上面的代码给出了预期的输出,但在数据显示之前输出总是先有 undefined
。无论如何迭代来自 Firebase 的数组,都会发生这种情况。
在加强我的Google-Fu之后,我制定了以下解决方案
var globalVariableArray = []
var globalVariable
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "DataCollection") {
Promise.all(
qs.docs.map(doc => {
globalVariableArray = doc.data().arrayWithDesiredData;
})
);
}
else {
return
}
});
var mailOptions = {
from: foo@blurdybloop.com,
to: 'bar@blurdybloop.com
subject: 'It works!!',
html: `${globalVariableArray.map(dataIWantedAllAlong => <p>dataIWantedAllAlong.desiredData</p> )}` <--- Here I simply loop through the array inside the interpolation blocks and voila! no more undefined showing up in the results
};
我在插入动态数据的括号内执行循环,不再让讨厌的 undefined
出现在我的电子邮件中。
祝大家旅途平安,编程愉快!
我有一个场景,我需要一次查询多个集合并根据集合名称检索值。我使用 Promise.all 这样做,它会像这样工作
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("collection1").where("user_id", "==", uid).get(),
admin.firestore().collection("collection2").where("user_id", "==", uid).get(),
admin.firestore().collection("collection3").where("user_id", "==", uid).get(),
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "collection1") {
qs.docs.map((doc) => {
valuesArr1.push(doc.data().arr);
});
} else if (qs.query._queryOptions.collectionId == "Collection2") {
qs.docs.map((doc) => {
valuesArr2.push(doc.data());
});
} else if (qs.query._queryOptions.collectionId == "collection3") {
qs.docs.map((doc) => {
valuesArr3.push(doc.data());
});
}
} else {
return
}
});
for (var i=0; i < valuesArr1.length; i++) {
if (valuesArr1[i].desiredData) {
console.log('datas from for loop on datas array', valuesArr1[i].desiredData)
globalVariable += `<img src="${valuesArr1[i].desiredData}">`;
}
}
执行此操作后,我会映射我获得的查询快照,并且能够像这样检索到目前为止的值
从第一个集合中,我从 firestore 文档中检索了一个数组,然后我只从集合中检索了以下集合中的所有文档。这都是 'works',因为当我 console.log 进入功能控制台时,数据显示完全符合预期。只有当我想遍历数据并将结果分配给全局变量以在其他地方使用时,才会出现奇怪的行为。
console.log 在函数控制台中显示所需的数据没有问题,但是当我将该数据插入 html 并在 nodemailer 中发送时的输出我得到以下结果
undefined 始终是响应中的第一个,但是如果我只使用 = 赋值运算符,则没有 undefined 但我显然没有得到我期望的所有数据。
我正在检索的集合中没有未定义的值或文档,我已经彻底检查并删除了文档以确保这一点。经过几天的研究,我得出的结论是它与我正在使用的承诺的异步性质有关,并且在我迭代它时数据没有立即准备好。
有人可以帮助我了解我做错了什么以及如何在节点中修复它吗?
我找到了解决我的问题的方法并想分享它,希望它能为未来的观众节省一些时间。
之前,我将来自 Firebase 的数组结果存储在一个全局变量中。为了省去一些麻烦,我会 post 下面再写一遍代码。
var globalVariableArray = []
var globalVariable
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "DataCollection") {
Promise.all(
qs.docs.map(doc => {
globalVariableArray = doc.data().arrayWithDesiredData;
})
);
}
else {
return
}
});
globalVariableArray.map(gv => {
globalVariable += `<p>gv.desiredData</p>` // <--- Right here is where the problem area was
})
var mailOptions = {
from: foo@blurdybloop.com,
to: 'bar@blurdybloop.com
subject: 'Almost but not quite',
html: `${globalVariable}`
};
上面的代码给出了预期的输出,但在数据显示之前输出总是先有 undefined
。无论如何迭代来自 Firebase 的数组,都会发生这种情况。
在加强我的Google-Fu之后,我制定了以下解决方案
var globalVariableArray = []
var globalVariable
var dbPromises = [];
dbPromises.push(
admin.firestore().collection("DataCollection").where("user_id", "==", uid).get()
);
const promiseConst = await Promise.all(dbPromises);
promiseConst.forEach((qs) => {
if (qs.size > 0) {
if (qs.query._queryOptions.collectionId == "DataCollection") {
Promise.all(
qs.docs.map(doc => {
globalVariableArray = doc.data().arrayWithDesiredData;
})
);
}
else {
return
}
});
var mailOptions = {
from: foo@blurdybloop.com,
to: 'bar@blurdybloop.com
subject: 'It works!!',
html: `${globalVariableArray.map(dataIWantedAllAlong => <p>dataIWantedAllAlong.desiredData</p> )}` <--- Here I simply loop through the array inside the interpolation blocks and voila! no more undefined showing up in the results
};
我在插入动态数据的括号内执行循环,不再让讨厌的 undefined
出现在我的电子邮件中。
祝大家旅途平安,编程愉快!