用 bluebird 来运行控制 async function
最近写了不少 async await 的代码。但是发现有一个问题,就是如果需要并行执行一定数量的 async function,不知如何来控制 concurrency 同时执行的最大数量。想到 bluebird 中有现成的 .map 之类的方法可以控制 concurrency,遂进行了如下尝试,希望借此抛砖引玉,有更好的方法的话欢迎回帖!
import sleep from 'then-sleep';
import Promise from 'bluebird';
const asyncToPromise = func => {
return (...args) => Promise.try(async () => await func.apply(this, args));
};
const sleepAsync = async (ms) => {
console.time(`sleep ${ms}ms`);
await sleep(ms);
console.timeEnd(`sleep ${ms}ms`);
};
console.time('total');
Promise.map([1000, 2000, 3000], (ms) => asyncToPromise(sleepAsync)(ms), { concurrency: 1 })
.then(() => console.timeEnd('total'));