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);
添加回答
举报