3 回答

TA貢獻1873條經驗 獲得超9個贊
您不需要第三方庫來完成此操作。只需使用Promise.all()和Array.prototype.map()。
const customerDetails = await Promise.all(
customers.map(customer => details(customer))
);

TA貢獻1784條經驗 獲得超2個贊
阿庫不需要異步迭代項的陣列。
例如,要異步處理此數組:
const arr = [1, 2, 3];
首先,從數組創建一個生成器,以便您可以為數組中的每個項目生成執行:
/**
* A convenience function for creating a ES2015 Generator to iterate over
* items in an array.
*
* @template T
* @param {T[]} value
*/
function* toIterator<T>(value: T[]) {
const generator = value[Symbol.iterator]();
for (let generated of generator) {
yield generated;
}
}
然后,異步迭代數組的關鍵是resolve在提供的handler.
/**
* Provides the ability to process an iterator's values asynchronously
* with a predicate, `hander`.
*
* @template T
* @template TReturn
* @template TNext
* @param {Generator<T, TReturn, TNext>} generator
* @param {(arg: T) => Promise<TReturn>} handler
* @returns
*/
async function iterateAsynchronously<T, TReturn, TNext>(
generator: Generator<T, TReturn, TNext>,
handler: (arg: T) => Promise<TReturn>
) {
const iterate: () => Promise<TReturn> = async () => {
const generated = generator.next();
if (generated.done) {
return generated.value;
}
return handler(generated.value).then(iterate);
};
return iterate();
}
如果您愿意,可以使用這些方法中的一種或兩種來擴展全局數組。另一個例子。
這將允許您在異步處理項目后將更多數組方法鏈接在一起:
const run = async () => {
const arr = [1, 2, 3, 4];
console.log((await arr.iterateAsynchronously((val) => new Promise(r => {
setTimeout(r, 2000);
console.log('Processing', val);
}))).reverse());
}
run();
在這種情況下,由于使用返回數組本身的函數擴展修改了數組原型,因此您可以像以前一樣將數組方法鏈接在一起。

TA貢獻1784條經驗 獲得超8個贊
此代碼將details()一個接一個地為每個客戶運行,而無需等待前一個。您創建了一系列承諾并在最后等待它們
const promises = [];
for (let i = 0; i < customers.length; i++) {
let p = new Promise(async (resolve, reject) => {
customers[i] = await details(customers[i]);
resolve();
});
promises.push(p);
}
await Promise.all(promises);
添加回答
舉報