首页 文章

Promise.all()被拒绝后的值,显示[''PromiseStatus'']:如果存在catch块则解析

提问于
浏览
5

我有两个承诺,一个拒绝,另一个解决 . Promise.all被调用 . 它执行Promise.all的catch块,因为其中一个承诺被拒绝 .

const promise1 = Promise.resolve('Promise 1 Resolved');
const promise2 = Promise.reject('Promise 2 Rejected');

const promise3 = Promise.all([promise1, promise2])
  .then(data => {
    console.log('Promise.all Resolved', data);
  })
  .catch(error => {
    console.log('Promise.all REJECTED', error);
  })
setTimeout(() => {
  console.log(promise1, promise2, promise3)
}, 200);

enter image description here

如果我没有Promise.all()上的catch,则值仍为Rejected,即

const promise3 = Promise.all([promise1, promise2])
  .then(data => {
    console.log('Promise.all Resolved', data);
  })

我错过了一些关于承诺的事情 .

2 回答

  • 4

    我看到它的答案,但我想我可以澄清一点 .

    请记住每个 then()catch() 都返回一个 Promise . (如果回调中没有任何明确的 return ,则两者都将返回 Promise.resolve(undefined) ) . 因此,在promise解决之后,整个promise链的值将是last then() 返回的promise . 例:

    promise = Promise.resolve(1)
        .then(() => Promise.resolve(2))
        .then(() => Promise.resolve(3));
    console.log(promise);
    setTimeout(() => {
        console.log(promise)//Promise {<resolved>: 3}
    }, 0)
    

    catch() 的工作原理与 then() 完全相同 . 唯一的区别是它呼吁 rejected 承诺而不是 resolved . 在下面的示例中,我只是将所有 resolve 替换为 reject 来演示 .

    promise = Promise.reject(1)
        .catch(() => Promise.reject(2))
        .catch(() => Promise.reject(3));
    console.log(promise);
    setTimeout(() => {
        console.log(promise)//Promise {<rejectd>: 3}
    }, 0)
    

    现在回答你的问题 . Promise.all() 的值是被拒绝的承诺,因为数组中的一个承诺被拒绝 . 如果链中有一个catch块,则控制将转到 catch 块,该块将返回 Promise.resolve(undefined) . 如果链条中没有阻塞块,您将获得所拥有的东西:被拒绝的承诺 .

  • 2

    Promise上的 catchtry {} catch {} 块的作用相同,因为您已捕获错误状态,程序将继续正常运行 .

    这就是为什么,当你省略 catch 时,你的承诺状态是 "rejected" .

    如果在捕获错误后,您希望将promise状态返回为已拒绝,则需要从catch处理程序返回被拒绝的promise:

    const promise3 = Promise.all([promise1, promise2])
        .catch(error => {
            console.log("REJECTED", error);
            return Promise.reject(error);
        });
    console.log(promise3); // [[PromiseStatus]]: "rejected"
    

    与在 try {} catch { throw; } 块中执行 throw 类似

相关问题