Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果承诺失败,抓住机会,但要做下一个_Javascript_Promise_Async Await - Fatal编程技术网

Javascript 如果承诺失败,抓住机会,但要做下一个

Javascript 如果承诺失败,抓住机会,但要做下一个,javascript,promise,async-await,Javascript,Promise,Async Await,我目前有以下代码: const promise1 = aPromiseCall().then(r => logger(r)).catch(e => logger(e)); const promise2 = anotherPromiseCall().then(r => logger(r)).catch(e => logger(e)); 在异步函数中,我执行以下操作: const results = Promise.all([promise1, promise2]);

我目前有以下代码:

const promise1 = aPromiseCall().then(r => logger(r)).catch(e => logger(e));

const promise2 = anotherPromiseCall().then(r => logger(r)).catch(e => logger(e));
在异步函数中,我执行以下操作:

const results = Promise.all([promise1, promise2]);
我这样做是因为我想确保,如果承诺失败,我仍然可以做承诺。然而,我不知道这是否是实现这一目标的最佳方式。那么,我应该在每个承诺中抓住这些
,还是有更惯用的方法

同时,我想保证在我继续执行我的代码之前,所有的承诺都得到了解决/拒绝,这就是为什么我把它们放在一个
承诺中。所有
请参考

承诺。全部
要么全有,要么全无。一旦数组中的所有承诺都解决,它就会解决,或者一旦其中一个承诺被拒绝,它就会拒绝。换句话说,它要么用一个包含所有解析值的数组进行解析,要么用一个错误进行拒绝

您可以编写如下代码-

Promise.all([promise1, promise2]).then(r => console.log(r)).catch(e => console.log(e));
这可能是问题的解决方案,请参阅

从:

如果任何元素被拒绝,则所有元素均被拒绝。对于 例如,如果您传递了四个承诺,这些承诺在超时和 一个立即拒绝的承诺,然后承诺。所有人都会拒绝 马上

为了处理可能的拒收:

const promise1=aPromiseCall();
const promise2=另一个promiseCall();
//在异步函数中:
const results=等待承诺。全部([
promise1.catch(error=>error),
promise2.catch(error=>error),
]);
console.log(结果[0])
console.log(结果[1])
var promise1=新承诺((解决、拒绝)=>{
setTimeout(()=>resolve('resolved'),2000);
}); 
var promise2=新承诺((解决、拒绝)=>{
setTimeout(()=>reject('rejected'),1000);
});
(异步函数(){
const results=等待承诺。全部([
promise1.catch(error=>error),
promise2.catch(error=>error),
]);
console.log(结果[0]);
console.log(结果[1]);

})();
FYI您在第一行代码的末尾缺少了一个额外的
。如果您希望将每个承诺的结果传递给
promise.all的
then()
,则不应在没有
返回的情况下执行
then()
。您已经过度简化了您的用例,因此不清楚期望值是什么are@charlietfl我只是在记录结果/错误。我需要退货吗?我真的不在乎做一个承诺。总之,我只是用承诺来确保所有的承诺都实现了。因为在承诺之后,我做了其他的事情,所有的事情都必须在那之前完成。好吧……这就是我所说的期望。如果你不需要Promise.all中的结果,那么你所做的基本上应该是可以的。不抛出传递给它的错误的
catch()
会返回一个新的承诺,从而在承诺中解决。allCool,@charlietfl你能用你的评论添加一个答案吗,我认为这解决了我原来的问题。我感谢你的回答,但这并不是真正回答我的问题。我希望第二个承诺即使第一个失败也能执行。@HommerSmith它总是执行的
let a = new Promise((res, rej) => res('Resolved!')),
    b = new Promise((res, rej) => rej('Rejected!')),
    c = a.catch(e => { console.log('"a" failed.'); return e; }),
    d = b.catch(e => { console.log('"b" failed.'); return e; });

Promise.all([c, d])
  .then(result => console.log('Then', result)) // Then ["Resolved!", "Rejected!"]
  .catch(err => console.log('Catch', err));

Promise.all([a.catch(e => e), b.catch(e => e)])
  .then(result => console.log('Then', result)) // Then ["Resolved!", "Rejected!"]
  .catch(err => console.log('Catch', err));