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));