Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据响应跳过承诺链中的jQuery承诺_Javascript_Jquery_Promise - Fatal编程技术网

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

Javascript 根据响应跳过承诺链中的jQuery承诺,javascript,jquery,promise,Javascript,Jquery,Promise,我有一系列jQuery承诺,但我想跳过其中一个,这取决于之前承诺的响应 我的代码类似于: getMoney() .then(getBeer) .then(getFireworks) .then(getLighterfluid) .then(getCrazy); 如果我的getFireworks函数中的承诺返回类似“没有可用的焰火”的内容,那么我想跳过getLighterFluid承诺,然后转到getCrazy 我如何在当前设置中实现这一点?或者我需要重做吗?有很多方法可以解决这

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

我的代码类似于:

getMoney()
  .then(getBeer)
  .then(getFireworks)
  .then(getLighterfluid)
  .then(getCrazy);
如果我的getFireworks函数中的承诺返回类似“没有可用的焰火”的内容,那么我想跳过getLighterFluid承诺,然后转到getCrazy


我如何在当前设置中实现这一点?或者我需要重做吗?

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

在本例中,我将使用以下帮助程序包装
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
,并使代码具有相当的描述性。

假设
getFireworks
解析为
[{type:“rocket”}]
或类似,那么
getLighterFluid
就无能为力了

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

    //go get that lighter fluid
}

getLighterFluid
只需检查一下是否有烟火。如果没有,什么也不做。
.catch(get救护车)
类似但更全面的方法是使用针对该问题提供的任何解决方案。这将允许您在链的任何位置考虑所有/任何以前的异步结果。例如,你可以跟踪每个阶段剩下多少钱并相应地花费,或者根据买了多少啤酒和烟火来确定“疯狂”的程度。