JavaScript承诺 - 多个承诺失败时的逻辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript承诺 - 多个承诺失败时的逻辑相关的知识,希望对你有一定的参考价值。

如果一组Promise被拒绝(所有这些),我如何应用逻辑?

validUserIdPromise = checkValidUserId(id)
  .then(() => console.log("user id")
  .catch(() => console.log("not user id")

validCarIdPromise = checkValidCarId(id)
  .then(() => console.log("car id")
  .catch(() => console.log("not car id");

// TODO how to call this? console.log("neither user nor car");

扩大我的问题:是否建议使用Promise.reject()进行javascript应用程序的正常流量控制,或者仅在出现问题时使用它?

使用案例:我的nodeJs app从客户端接收uuid,并根据匹配的资源(示例中的用户或汽车)进行响应。

答案
// Return a promise in which you inject true or false in the resolve value wheather the id exists or not
const validUserIdPromise = checkValidUserId(id)
  .then(() => true)
  .catch(() => false)

// same
const validCarIdPromise = checkValidCarId(id)
  .then(() => true)
  .catch(() => false)

// resolve both promises
Promise.all([validUserIdPromise, validCarIdPromise])
  .then(([validUser, validCar]) => { // Promise.all injects an array of values -> use destructuring
    console.log(validUser ? 'user id' : 'not user id')
    console.log(validCar ? 'car id' : 'not car id')
  })

/** Using async/await */

async function checkId(id) {
  const [validUser, validCar] = await Promise.all([validUserIdPromise, validCarIdPromise]);
  console.log(validUser ? 'user id' : 'not user id')
  console.log(validCar ? 'car id' : 'not car id')
}

checkId(id);
另一答案

您可以从Promise返回已解析的.catch(),将两个函数传递给Promise.all()然后检查链接.then()的结果,必要时在.then()传播错误

var validUserIdPromise = () => Promise.reject("not user id")
  .then(() => console.log("user id"))
  // handle error, return resolved `Promise`
  // optionally check the error type here an `throw` to reach
  // `.catch()` chained to `.then()` if any `Promise` is rejected
  .catch((err) => {console.error(err); return err});

var validCarIdPromise = () => Promise.reject("not car id")
  .then(() => console.log("car id"))
  // handle error, return resolved `Promise`
  .catch((err) => {console.error(err); return err});
  
Promise.all([validUserIdPromise(), validCarIdPromise()])
.then(response => {
  if (response[0] === "not user id" 
      && response[1] === "not car id") {
        console.log("both promises rejected")
      }
})
.catch(err => console.error(err));

以上是关于JavaScript承诺 - 多个承诺失败时的逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有“快速失败”行为的情况下并行等待多个承诺? [复制]

带有多个猫鼬查找的foreach循环后的javascript承诺

javascript 带有取消的多个承诺链

Javascript,如何等待多个承诺[重复]

Javascript竞争条件多个承诺连接字符串

Javascript - 链多个获取承诺