我知道這個問題已經被問過了,但我無法做到這一點。嘗試使用承諾但無濟于事。當控制臺記錄 req.user items 仍然是一個空陣列。我知道我應該使用承諾,但我在實施它時遇到了麻煩。幫助表示贊賞
app.get('/cart',checkAuthenticated, async (req, res) => {
if(req.user.cart.length > 0){
req.user.items = []
req.user.cart.map(async (item) => {
var itemDescription = await productsModel.findOne({id: item.itemId})
req.user.items.push(itemDescription)
});
console.log(req.user)
}
uj5u.com熱心網友回復:
它為空的原因是您沒有等待地圖中的所有異步函式完成。試試這個:
await Promise.all(req.user.cart.map(async (item) => {
var itemDescription = await productsModel.findOne({id: item.itemId})
req.user.items.push(itemDescription)
}));
請注意,@jfriend00 已評論此實作不會保證 req.user.items 中專案的順序。
因為您已經在使用 map ,所以執行以下操作更簡單,并且還保證了專案的順序:
req.user.items = await Promise.all(req.user.cart.map(async (item) => {
var itemDescription = await productsModel.findOne({id: item.itemId})
return itemDescription;
}));
uj5u.com熱心網友回復:
.map()沒有承諾意識。它不注意async回呼函式回傳的承諾。因此,一旦您點擊await productsModel.findOne(...),該async函式就會回傳一個未實作的承諾,并.map()推進到回圈的下一次迭代。
有很多不同的方法可以解決這個問題。如果你想使用.map(),那么你需要注意你的回呼回傳的承諾是這樣的:
app.get('/cart', checkAuthenticated, async (req, res) => {
if (req.user.cart.length > 0) {
req.user.items = await Promise.all(req.user.cart.map((item) => {
return productsModel.findOne({ id: item.itemId });
}));
console.log(req.user)
}
});
上述實作將嘗試并行運行所有資料庫查找。
一個更簡單的實作只使用一個簡單的for回圈并一次運行一個資料庫查找:
app.get('/cart', checkAuthenticated, async (req, res) => {
if (req.user.cart.length > 0) {
req.user.items = [];
for (let item of req.user.cart) {
req.user.items.push(await productsModel.findOne({ id: item.itemId }));
}
console.log(req.user)
}
});
uj5u.com熱心網友回復:
在您的示例中,陣列仍然為空,因為 map 函式中的回呼異步作業,因此您需要等待代碼完成。因為 map 函式回傳一個 Promise 陣列,所以它們都需要使用 Promise.all 來解決:
app.get('/cart', checkAuthenticated, async (req, res) => {
if (req.user.cart.length > 0) {
req.user.items = []
const promises = req.user.cart.map(async (item) => {
var itemDescription = await productsModel.findOne({ id: item.itemId })
req.user.items.push(itemDescription)
});
await Promise.all(promises);
console.log(req.user)
}
});
否則,您可以用 for 回圈替換 map 函式:
app.get('/cart', checkAuthenticated, async (req, res) => {
if (req.user.cart.length > 0) {
req.user.items = []
for (const item of req.user.cart) {
var itemDescription = await productsModel.findOne({ id: item.itemId })
req.user.items.push(itemDescription)
}
console.log(req.user)
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462304.html
標籤:javascript 节点.js 数组 表示 异步
上一篇:Promise、await/async和setTimeout有什么區別?
下一篇:C#相當于C 延遲異步執行?
