[英]Promise.then before resolve
我有一個對象數組,每個對象都需要來自 api 調用的數據。
每個對象的 api 端點都不同。
我正在迭代對象數組並為每個對象創建一個承諾。
然后我使用 Promise.all 傳遞一系列承諾。
一旦承諾得到解決,我需要用它們各自的數據更新原始的對象數組。 為了防止兩次迭代對象數組,我在 Promise 解決之前將 then 的結果分配(為了更好的詞)。
它有效,但是這種方法有什么陷阱嗎?
updateData = async (objects) => {
const promises = [];
objects.forEach(object => {
if (object.data === undefined) {
const service = this.serviceFactory.getService(object.serviceKey);
promises.push(service[object.serviceFunc](object.id).then(data => object.data = data));
}
});
await Promise.all(promises);
};
不,一切都很好,但我鼓勵你使用 async/await 來完成整個實現。 像這樣的東西:
const processObject = async (object) => {
if (object.data === undefined) {
const service = this.serviceFactory.getService(object.serviceKey);
const data = await service[object.serviceFunc](object.id);
object.data = data
}
return object;
}
updateData = async (objects) => {
const promises = objects.map(processObject);
const processedObjects = await Promise.all(promises);
};
它有效,但是這種方法有什么陷阱嗎?
顯示的代碼本身很好,這是否可能有陷阱更多地取決於調用方(您如何處理updateData
以及是否清楚傳遞給函數的對象已更新)。
關於代碼本身:我可能會使用map
而不是forEach
,這將允許您在該回調中使用await
,並使其在意外破壞回調中的 Promise 鏈方面不太容易出錯。
updateData = async(objects) => { const promises = objects.map(async (object) => { if (object.data === undefined) { const service = this.serviceFactory.getService(object.serviceKey); object.data = await service[object.serviceFunc](object.id); } }); await Promise.all(promises); };
在object.data === undefined
為 false 的情況下,返回值為undefined
,但這不是問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.