我正在嘗試映射物件,其中正確的 ID 將包含屬于它的陣列。
這是場景:
let obj = {}
const arr = []
for (let i = 0; i < someIds.length; i ) {
const res = await someApiCall() // returns array
obj = {
id: someIds[i],
res
}
arr.push(obj)
return arr
}
這里的事情是,arr由于迭代值,它只會輸出最后一組物件。
例如我得到
[{id: 122, res: "whatever122"}]
我想去哪里
[{id: 122, res: "whatever122"}, {id: 111, res: "whatever111"}, {id: 133, res: "whatever133}]
我如何連接所有?
uj5u.com熱心網友回復:
arr你快回來。它應該在for范圍之外回傳:
let obj = {}
const arr = []
for (let i = 0; i < someIds.length; i ) {
const res = await someApiCall() // returns array
obj = {
id: someIds[i],
res
}
arr.push(obj)
}
return arr
uj5u.com熱心網友回復:
將 return 陳述句移到 for 回圈之外,這將等待所有物件添加到陣列中。
let obj = {}
const arr = []
for (let i = 0; i < someArr.length; i ) {
const res = await someApiCall() // returns array
obj = {
id: res[i],
res
}
arr.push(obj)
}
return arr
uj5u.com熱心網友回復:
問題是由return可能應該留在for回圈之外的陳述句產生的。它完成當前函式的執行并將(可選值)回傳給呼叫者。
撰寫所需內容的更簡單方法是使用并行Promise.all()運行所有呼叫someApiCall()(如果它們是獨立的)。這樣代碼運行得更快:
async function doSomething() {
return await Promise.all(
someIds.map(
async (id) => {
return {
id: id,
res: await someApiCall(id),
};
}
)
);
}
這個怎么運作
someIds.map()呼叫它作為每個專案的引數接收的回呼函式,someIds并回傳一個新陣列,其中包含回呼函式回傳的值。
因為回呼函式是異步的并且使用,所以它會在-ed 呼叫開始await時回傳 a ,而無需等待它完成。Promiseawait
回傳的承諾陣列someIds.map()作為引數傳遞給Promise.all()等待所有承諾并回傳一個包含承諾回傳值的陣列(如果它們是同步的,這些是回呼回傳的物件)。
評論
前面await的Promise.all()并不是真正需要的。沒有它,該函式doSomething()將回傳由Promise.all(). 有了它,函式回傳一個物件陣列。無論哪種方式,doSomething()仍然需要await-ed 的呼叫,并且它產生的值await是一個物件陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/505634.html
標籤:javascript 打字稿
上一篇:按鈕未在React.js中呈現
