根据响应跳过承诺链中的jQuery承诺

Skip a jQuery promise in a chain of promises depending on response

本文关键字:承诺 jQuery 响应      更新时间:2023-09-26

我有一个jQuery承诺链,但我想根据早期承诺的响应跳过其中一个。

我的代码类似于:

getMoney()
  .then(getBeer)
  .then(getFireworks)
  .then(getLighterfluid)
  .then(getCrazy);

如果我的getFireworks函数中的promise返回类似"No fireworks available"的内容,那么我想跳过getLighterFluid promise,然后转到getCrazy。

我如何用我目前的设置来解决这个问题?或者我需要返工吗?

假设getFireworks解析为[ { type: "rocket" } ]或类似,那么getLighterFluid就什么都做不了。

function getLighterFluid(fireworks) {
    if (!fireworks.length) return;
    //go get that lighter fluid
}

有很多方法可以解决这个问题,但本质上你必须改变链的结构或函数本身。

在这种情况下,我会用这样的助手来包装getLighterfluid

getMoney()
  .then(getBeer)
  .then(getFireworks)
  .then(function(val) { if(val != 'No fireworks available') return getLighterfluid(val); })
  .then(getCrazy);

如果你需要大量使用,你可以推广这种模式:

function conditionally(predicate, handler) {
  return function(val) {
    if(predicate(val) {
      return handler(val);
    }
  };
}
function notEqualFunc(val) {
  return function(v) {
    return v != val;
  };
}
getMoney()
  .then(getBeer)
  .then(getFireworks)
  .then(conditionally(notEqualFunc('No fireworks available'), getLighterfluid))
  .then(getCrazy);

您可以创建所需的任何谓词原型,而不是notEqualFunc,并使代码具有很强的描述性。