我一直在努力理解這有什么問題,但我仍然無法意識到我做錯了什么。我正在嘗試將用戶購物籃的每個專案作為訂單項添加到資料庫中,使用 .map() 函式(資料庫中的訂單項對應于產品,這與問題并不真正相關,但如果您是努力理解操作):
const orderItems= orderData.map(async product=>{
const productId=product.id.slice(0,product.id.length-5)
const targetProduct=await dataSources.ProductAPI.product(productId)
const name=targetProduct.name
const quantity=218327
await dataSources.OrderItemAPI.createOrderItem(orderId,productId,name,quantity,{ttlInSeconds:60*20})
})
然后,我試圖將上述陣列orderItems中的每個 orderItem 映射到資料庫中的實際產品,如下所示:
//我們找到每個orderItem對應的產品
const productsCorrespondingToOrderItems= orderItems.map(async orderItem=>{
const trial=await orderItem
console.log(trial) <--- returns undefined
// OR just logging orderItem returns a promise
await dataSources.TransactionAPI.findProductFromOrderItem(orderItem.productId).then(x=>console.log(x))
})
我已經檢查了訂單專案中的每個專案,看起來還不錯。問題是,當我只是記錄它時,每個orderItemin 都會productsCorrespondingToOrderItems回傳一個 promise,或者如果我等待它,則回傳 undefined。我真的不明白,我做錯了什么?非常感謝 !
uj5u.com熱心網友回復:
async函式總是回傳一個承諾。您不會從map回呼中回傳任何內容,因此由于回呼是async函式,因此它們回傳使用undefined.
如果您想等待操作中的所有承諾map完成,請Promise.all在結果上使用。Promise.all回傳一個承諾,該承諾將使用您提供的承諾的履行值陣列來履行(如果它們都已履行),或者在其中任何一個第一次拒絕時被拒絕。您可以使用await(在async函式中)或通過呼叫.then/.catch來等待該承諾。
這是一個示例,假設您正在執行的代碼map不在async函式中:
// If not in an `async` function
Promise.all(orderData.map(async product => {
const productId = product.id.slice(0, product.id.length - 5);
const targetProduct = await dataSources.ProductAPI.product(productId);
const name = targetProduct.name;
const quantity = 218327;
const orderItem await dataSources.OrderItemAPI.createOrderItem(
orderId,
productId,
name,
quantity,
{ ttlInSeconds: 60 * 20 }
);
return await dataSources.TransactionAPI.findProductFromOrderItem(orderItem.productId);
}))
.then(productsCorrespondingToOrderItems => {
// ...use `productsCorrespondingToOrderItems` here...
})
.catch(error => {
// ...handle/report error...
});
請注意,它是并行作業的。如果您想串聯進行,請使用async函式和for-of回圈。
uj5u.com熱心網友回復:
您沒有從地圖中回傳任何內容,并且地圖不適用于 async/await。這樣做是為了一次呼叫 api 一次(串行)。如果您想同時(并行)等待多個 api 呼叫,請使用 TJ Crowder 的答案。
const orderItems= [];
for (const product of orderData) {
const productId=product.id.slice(0,product.id.length-5)
const targetProduct=await dataSources.ProductAPI.product(productId)
const name=targetProduct.name
const quantity=218327
await dataSources.OrderItemAPI.createOrderItem(orderId,productId,name,quantity,{ttlInSeconds:60*20})
})
// push something to the orderItems array here!
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/322094.html
標籤:javascript 节点.js 异步 异步等待
上一篇:MVC中的正確結構與spring
