【发布时间】:2021-03-03 23:55:26
【问题描述】:
我的问题基本上是综合
我知道Promise.allSettled,但我没能找到同时限制并发的好方法。
到目前为止我所拥有的:
想法 1 使用p-limit:
const pLimit = require('p-limit');
const limit = pLimit(10);
let promises = files.map(pair => {
var formData = {
'file1': fs.createReadStream(pair[0]),
'file2': fs.createReadStream(pair[1])
};
return limit(() => uploadForm(formData));
});
(async () => {
const result = await Promise.allSettled(promises).then(body => {
body.forEach(value => {
if(value.status == "rejected")
file.write(value.reason + '\n---\n');
});
});
})();
我对这个解决方案的问题是,我必须首先创建所有 Promise,然后为每个 Promise 打开两个文件流,我将达到打开文件的限制。
想法 2 使用p-queue:
我尝试使用生成器函数在 queue.on 'next' 事件中创建和添加新的 Promise,但我无法让它正常工作,这可能不是这项工作的正确工具。
想法 3 使用 PromisePool:
这在一开始看起来很有希望。其中一些支持生成器函数来为池创建 Promise,但我找不到一个明确声明其行为类似于 Promise.allSettled 的函数。
我实现了es6-promise-pool 却发现它会在第一次promise 被拒绝后停止。
【问题讨论】:
标签: javascript node.js concurrency promise