【问题标题】:JavaScript Promise - logic when multiple promises failJavaScript Promise - 多个 Promise 失败时的逻辑
【发布时间】:2020-01-11 06:03:25
【问题描述】:

如果一组 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 应用程序从客户端接收 uuid,并根据匹配的资源(示例中的用户或汽车)进行响应。

【问题讨论】:

  • 您是否要确定validUserIdPromisevalidCarIdPromise 是否都被拒绝?如果只有一个Promise 被拒绝,会发生什么?
  • 是的,我正在尝试确定。
  • 只是我的 2 美分;如果您拒绝“未找到”但“未找到”是预期结果,我认为最好使用特殊的“未找到”值来解决。让 Promise 在意外结果上失败,这样您就可以更轻松地区分 2. 在“未找到”中解决的 Promise 可以遵循快乐路径,但意外错误可以遵循 catch 路径。这个问题应该伴随着checkValid... 函数,因为我想这就是你的问题所在。如果找不到东西,它是否应该拒绝。

标签: javascript promise control-flow


【解决方案1】:
// 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);

【讨论】:

    【解决方案2】:

    您可以从.catch() 返回已解析的Promise,将两个函数都传递给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));

    【讨论】:

    猜你喜欢
    • 2017-03-13
    • 2016-12-19
    • 2019-08-03
    • 2016-01-27
    • 2017-02-09
    • 2021-06-20
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多