Javascript 未处理的承诺拒绝与承诺。全部解决并尝试/捕获

Javascript 未处理的承诺拒绝与承诺。全部解决并尝试/捕获,javascript,node.js,promise,try-catch,Javascript,Node.js,Promise,Try Catch,我的想法如下: 我想同时发送多个请求,而不必等到执行之前 因此,我的伪代码如下所示: 功能睡眠(毫秒){ 返回新承诺(resolve=>setTimeout(resolve,ms)); } 函数失败请求(){ 返回新承诺((解决、拒绝)=>{ 拒绝(“请求失败”); }); } 函数successRequest(){ 返回新承诺((解决、拒绝)=>{ 解决(“请求成功”); }); } 异步函数main(){ 试一试{ 让执行=[]; push(failingRequest()); 等待睡眠(

我的想法如下: 我想同时发送多个请求,而不必等到执行之前

因此,我的伪代码如下所示:

功能睡眠(毫秒){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
函数失败请求(){
返回新承诺((解决、拒绝)=>{
拒绝(“请求失败”);
});
}
函数successRequest(){
返回新承诺((解决、拒绝)=>{
解决(“请求成功”);
});
}
异步函数main(){
试一试{
让执行=[];
push(failingRequest());
等待睡眠(4000);
push(successRequest());
让结果=等待承诺。全部解决(执行);
控制台日志(结果);
}捕捉(错误){
console.log('发生外部错误');
控制台日志(错误消息);
}
console.log('done');
}

main()有趣的问题-问题是您实际上并没有模拟异步请求。事实上,您的两个请求方法只是创建同步/立即解决/拒绝的承诺。您需要将
wait
放在
failingRequest()
之前,以便在周围
try/catch
中捕获被拒绝的承诺,但这可能不是您想要的

相反,你不应该立即“开始”承诺,而是应该是这样的:

try {
        let executions = [];
        executions.push(failingRequest);
        await sleep(4000);
        executions.push(successRequest);
        let result = await Promise.allSettled(executions.map(promiseFn => promiseFn()));
        console.log(result);
    } catch (err) {
        console.log('Outer error occured.');
        console.log(err.message);
    }
这将记录

[
  { status: 'rejected', reason: 'Request failed' },
  { status: 'fulfilled', value: 'Request success' }
]
done
正如所料

知道为什么会这样吗

创建失败请求()
,然后等待4秒钟再处理它

我只是为了测试而插入睡眠


…因此你导致了未经处理的拒绝。移除
等待睡眠(4000)它将按预期工作

您愿意使用async await吗?请阅读:@DipakC OP已经使用async/await了?这也是一个有趣的答案。我没有想到这一点,它似乎起了作用。。。但是回到我最初的测试:如果一个请求在10秒后超时,这会阻止执行
catch
块吗?我需要确保所有
执行
都将被执行,无论它们是单独解决还是拒绝。是的,如果您这样做,可以保证所有执行都将被执行。您甚至可以通过在请求函数中添加
setTimeout
来模拟它。我已经为您创建了一个修改版本的代码,它可能会帮助您理解正在发生的事情:这太棒了!我想知道如何将参数应用于这些函数,但
.bind()
成功了。谢谢我不明白你为什么要这么做。你同样可以移动
等待睡眠(4000)执行
数组之前的代码>行。我试图指出的一点是,承诺与OP的原始代码同步/立即执行,并且由于
等待睡眠(…)
,立即拒绝的承诺不再被捕获。当然,在我的示例中,
wait sleep
没有多大意义,但我决定保留它,以便OP能够理解;对于(设i=0;i<1000000;i++){executions.push(failingRequest());executions.push(successRequest());}
第一次拒绝似乎也不会立即处理,而且仍然不会被任何
未处理的承诺拒绝
…是的,它会立即(=同步)处理通过
Promise.allselled(executions)
调用。但随后它会等待4秒钟,等待这些承诺的解决,然后再记录所有执行的结果。