根据响应,在一系列承诺中跳过jQuery承诺

时间:2015-11-06 14:37:46

标签: javascript jquery promise

我有一系列jQuery承诺,但我想跳过其中一个,取决于先前承诺的响应。

我的代码类似于:

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

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

我如何使用当前的设置来解决这个问题?或者我需要重做这个吗?

2 个答案:

答案 0 :(得分:2)

有很多方法,但基本上你必须改变链的结构或函数本身。

在这种情况下,我用这样的助手包装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,并使代码具有描述性。

答案 1 :(得分:2)

假设getFireworks解析为[ { type: "rocket" } ]或类似,那么getLighterFluid可能无效。

function getLighterFluid(fireworks) {
    if (!fireworks.length) return;

    //go get that lighter fluid
}