我正在努力使其正常作業。我的 nodejs 后端有這個功能
let data = [];
let lists = [];
var userId = request.params.userId;
var coll = db.collection("forms");
var query = coll.where("formUser", "==", userId);
await query.get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
var forms = doc.data();
var listIDs = doc.data().formLists;
listIDs.forEach(listId => {
db.collection("lists").where("listId", "==", listId).get().then(function (snapshot) {
snapshot.forEach(function (d) {
lists.push({ "id": d.data().listId, "text": d.data().listName });
});
});
});
forms.formLists = lists;
data.push(forms);
});
});
由于某種原因,第二個回圈不只是作業,資料的結果來自第一個回圈,如果我將相同的函式放在我的 javascript 前端,我會得到帶有 listIDs 結果的完整資料。
請問有什么想法嗎?
uj5u.com熱心網友回復:
添加一個await并不會突然讓其下的所有代碼同步運行。這也是典型的反模式相結合await,并then為你做。我建議遠離async/await直到您掌握了異步行為,并在此之前堅持then并明確處理承諾。
如果您共享的代碼在 Cloud Functions 中運行,您將需要回傳一個在所有異步(讀取和寫入)操作完成后決議的承諾。由于您有很多這樣的操作,您需要將從它們獲得的所有承諾捕獲到一個陣列中,然后Promise.all()用于回傳值:
var userId = request.params.userId;
var coll = db.collection("forms");
var query = coll.where("formUser", "==", userId);
return query.get().then(function (querySnapshot) { // ??
let promises = []; // ??
querySnapshot.forEach(function (doc) {
var forms = doc.data();
var listIDs = doc.data().formLists;
listIDs.forEach(listId => {
promises.push(db.collection("lists").where("listId", "==", listId).get()); // ??
});
});
return Promise.all(promises).then(function (snapshot) { // ??
return snapshot.map((d) => {
return { "id": d.data().listId, "text": d.data().listName };
});
});
});
uj5u.com熱心網友回復:
因此,對于那些在如此復雜的資料結構中苦苦掙扎的人,這就是我所做的:
let data = [];
let forms = [];
let lists = [];
var userId = request.params.userId;
var coll = db.collection("forms");
var query = coll.where("formUser", "==", userId);
await query.get().then(function (querySnapshot) {
querySnapshot.forEach(function (doc) {
forms.push(doc.data());
});
});
for (let index = 0; index < forms.length; index ) {
const element = forms[index];
var listIDs = element.formLists;
for (const listId of listIDs) {
await db.collection("lists").where("listId", "==", listId).get().then(function (snapshot) {
snapshot.forEach(function (d) {
lists.push({ "id": d.data().listId, "text": d.data().listName });
});
});
}
element.formLists = lists;
data.push(element);
}
response.status(200).send(data); // pass your data to UI
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333919.html
