我正在撰寫一些看起來像這樣的Javascript代碼:
const arrayOfPromises = getArrayOfPromises();
Promise.all(arrayOfPromises)。 then(array => doStuff(array))。
我需要改變getArrayOfPromises()以回傳關于每個承諾的一些資訊--為了簡單起見,讓我們說它是一個簡單的真/假標志。我的第一直覺是重構這個函式,使其回傳一個物件陣列,例如:
。
const getArrayOfObjects=()=> {
...
return [
{ promise: promise1, flag: flag1 },
{ promise: promise2, flag: flag2 },
...
{ promise: promisen, flag: flagn }.
];
}
然而,上面的方法無法與Promise.all一起使用,因為它只能直接與Promise物件的可迭代物件一起使用,而沒有中間的包裝器物件。
什么是最簡單的方法來為每個承諾提供這樣的元資料,然后在所有承諾被解決后再使用它?
uj5u.com熱心網友回復:
如果你想在承諾被解決后使用這個元資料,并且你對從getArrayOfPromises()回傳的承諾所解決的值沒有任何控制,那么你可以簡單地在陣列中每個單獨的承諾上呼叫then(),并使其回傳與你的元資料相結合的原始值。但要確保你用.then()回傳的承諾來替換原來的承諾。Array.prototype.map()使之變得簡單:
arrayOfPromises = arrayOfPromises.map(promise => /span> promise. then(value => ({
值。
flag: true: flag: true
})));
例子:
。let arrayOfPromises = getArrayOfPromises() 。
arrayOfPromises = arrayOfPromises.map(span class="hljs-params">promise => promise. then(value => ({
值。
flag: true: flag: true
})));
Promise.all(arrayOfPromises)。 then(array => doStuff(array)) 。
function getArrayOfPromises(/span>) {
return [sleep(1000)。sleep(1500), sleep(2000) ] 。
}
function doStuff(array) {
console.log(array)。
}
function sleep(ms) {
return new Promise(resolve => setTimeout(() => resolve('resolved after '/span> ms), ms))。
}
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
如果您確實可以控制getArrayOfPromises()回傳的內容,那么只需回傳元資料作為被決議的值的一部分即可。
uj5u.com熱心網友回復:
什么是最簡單的方法來為每個承諾提供這樣的元資料,然后在所有承諾都被解決后再使用它?
只需將資料放在每個結果值中。這不是關于承諾的元資料,而是關于值的元資料(?),而且在所有承諾被解決之前,您不需要使用它,所以結果是最合適的地方。標志只是成為array的內容,Promise.all(...)決議到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332968.html
標籤:
