我经常读到在async.js中使用Promises不是一个好主意。我想知道为什么。
我在一个项目中工作,我正在使用async.eachLimit来控制文件中异步操作的限制,并承诺在我完成所有异步操作后返回结果。示例:
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);
});
});如果我不应该同时使用两者,如何达到相同的效果?让我们忘记异步/等待一分钟,回到只有Promises和async.js存在的日子。我能做些什么?
谢谢。
发布于 2017-03-28 06:14:24
Bluebird的Promise.map允许你跳过一个Iterable并设置一个并发。
return Promise.map(arrayOfFiles, file => {
return callExternalLib(file).then((data) => {
file.data = data;
return file;
}
}, { concurrency: maxOfAsync }) 一旦所有promises都被解析,Promise.map将解析一个新的值数组。它不需要像原始代码和上面的例子那样改变现有的数组。
发布于 2017-05-05 05:42:18
我认为把异步回调语法和promise语法结合起来会混淆代码。我不认为这有什么本质上的问题。如果我的代码都使用promises,并且我引入了一个使用回调的库,我通常会用promises包装这个库,以保持代码的整洁。
发布于 2020-12-21 03:32:33
当你想使用promises时,Async.js是一种"meh“。它擅长于它所做的事情,但它显然是一个为简化回调的使用而构建的库,后来进行了升级,以尝试与promises一起工作。它甚至尝试对代码进行一些自动魔术反编译,试图知道一个函数应该像返回promise的异步函数还是使用回调的非异步函数那样处理(而且,就像所有进行反编译的库一样,如果您使用Babel或类似工具编译代码,它可能会失败)。
我最近发布了一个库,它是async.js的一个替代品,它被精确地设计为只使用Promises (和async/await),从而使一个完全一致的库可以使用这些较新的工具工作。
结果被命名为modern async,如下所示:https://nicolas-van.github.io/modern-async/
https://stackoverflow.com/questions/43055877
复制相似问题