嘗試以等待資料庫操作完成的方式撰寫它。可能的?
function addFriendsToSession(session, sessionId) {
const friends = [];
const incoming = session.users.forEach(async user => {
console.log('user', user);
await db
.collection('users/' user '/settings')
.doc(user)
.get()
.then(doc => {
if (doc.exists) {
const returnObj = doc.data();
return returnObj.friends ? returnObj.friends : [];
} else {
return [];
}
});
});
friends.push(incoming);
return friends;
}
uj5u.com熱心網友回復:
使用Promise.all。
Promise.all接受一系列承諾,并在每個承諾解決后解決。您可以使用map映射您的操作。例如,
const promises = session.users.map(user => {
console.log('user', user);
return db
.collection('users/' user '/settings')
.doc(user)
.get()
.then(doc => {
if (doc.exists) {
const returnObj = doc.data();
return returnObj.friends ? returnObj.friends : [];
} else {
return [];
}
});
});
const friends = await Promise.all(promises)
return friends;
uj5u.com熱心網友回復:
這里有很多問題。
- 在
db.then(),return中使用,但此值永遠不會從包含它的函式回傳(即async user => {...}) const incoming分配了 的結果session.users.forEach,但從Array.forEach()未有回傳值(您可能會想到Array.map()?)- 即使你解決了前兩個問題,
incoming仍然會是一個 Promises 陣列
附加建議:
- 不要將 async/await 與 .then 混用
把它們放在一起:
const incoming = session.users.map(async user => {
console.log('user', user);
const doc = await db
.collection('users/' user '/settings')
.doc(user)
.get();
//we assigned `doc` using await instead of using .then
if (doc.exists) {
const returnObj = doc.data();
return returnObj.friends ? returnObj.friends : [];
} else {
return [];
}
});
//incoming is not an array of Promises
const incomingFriends = await Promise.all(incoming); //takes an array of Promises and returns an array of the resolved values
//incomingFriends is now an array of friends
//next line would make the last element an array
//friends.push(incoming);
//you probably want to push every element of the array
friends.push(...incomingFriends);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/379770.html
標籤:javascript 承诺
