Javascript 限制并发,并等待所有承诺完成,即使有些承诺被拒绝

Javascript 限制并发,并等待所有承诺完成,即使有些承诺被拒绝,javascript,node.js,concurrency,promise,Javascript,Node.js,Concurrency,Promise,我的问题基本上是两个方面的结合 我知道,但是我没有找到一个好的方法来限制并发性 到目前为止,我所拥有的: 创意1使用: 这个解决方案的问题是,我必须首先创建所有承诺,这样做会为每个承诺打开两个文件流,我将达到打开文件的限制 创意2使用: 我尝试使用生成器函数在队列中创建和添加新的承诺。在'next'事件中,我无法使其正常工作,这可能不是适合此工作的工具 创意3使用承诺池: 这在一开始看起来很有希望。他们中的一些人支持一个生成器函数来为池创建承诺,但我找不到一个明确声明其行为类似的生成器函

我的问题基本上是两个方面的结合

我知道,但是我没有找到一个好的方法来限制并发性

到目前为止,我所拥有的:

创意1使用:

这个解决方案的问题是,我必须首先创建所有承诺,这样做会为每个承诺打开两个文件流,我将达到打开文件的限制

创意2使用: 我尝试使用生成器函数在
队列中创建和添加新的承诺。在
'next'
事件中,我无法使其正常工作,这可能不是适合此工作的工具

创意3使用承诺池: 这在一开始看起来很有希望。他们中的一些人支持一个生成器函数来为池创建承诺,但我找不到一个明确声明其行为类似的生成器函数


我实现它只是为了发现它将在第一次承诺被拒绝后停止。

它很简单,可以自己实现——创建一个函数数组,调用时返回承诺。然后实现一个限制器函数,从该数组中获取函数并调用它们,完成后,再次递归调用限制器,直到该数组为空:

const请求=(文件)=>newpromise((res,rej)=>{
log('请求',文件);
设置超时(()=>{
if(Math.random()<0.5){
log('resolving',file);
res(文件);
}否则{
log('拒绝',文件);
rej(文件);
}
},1000+数学随机()*1000);
});
常量文件=[1,2,3,4,5,6];
const makeRequests=files.map(file=>()=>request(file));
常量结果=[];
让开始=0;
常量递归=()=>{
常数i=已启动++;
const makeRequest=makeRequests.shift();
return!makeRequest?null:Promise.allSettled([makeRequest()]))
。然后(结果=>{
结果[i]=结果[0];
返回recurse();
})
};
常数极限=2;
all(Array.from({length:limit},recurse))
.然后(()=>{
控制台日志(结果);

});我喜欢这个解决方案。我从中学到了一些东西。谢谢。
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');
        });
    });
})();