我总是读到,将 Promises 与 async.js 一起使用并不是一个好主意。我想了解为什么。
我正在一个项目中使用 async.eachLimit 来控制文件中异步操作的限制,并 promise 在完成所有异步操作后返回结果。示例:
const maxOfAsync = process.env.maxOfAsync || 500;
return new Promise((resolve, reject) => {
async.eachLimit(arrayOfFiles, maxOfAsync, (file, callback) => {
callExternalLib(file).then((data) => {
file.data = data;
callback();
}).catch((error) => {
callback(error);
});
}, (error) {
if (error) return reject(error);
resolve(arrayOfFiles);
});
});
如果我不应该同时使用两者,如何达到相同的结果?让我们暂时忘记 async/await,回到只有 Promises 和 async.js 存在的日子。我能做什么?
谢谢。
最佳答案
bluebird 的Promise.map允许您跨过 Iterable 并设置并发性。
return Promise.map(arrayOfFiles, file => {
return callExternalLib(file).then((data) => {
file.data = data;
return file;
}
}, { concurrency: maxOfAsync })
一旦所有 Promise 都得到解决,Promise.map 将解析一个新的值数组。不需要像原始代码和上面的示例那样改变现有数组。
关于javascript - Promise + async.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43055877/