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秒钟,等待这些承诺的解决,然后再记录所有执行的结果。