Javascript 根据响应跳过承诺链中的jQuery承诺
我有一系列jQuery承诺,但我想跳过其中一个,这取决于之前承诺的响应 我的代码类似于:Javascript 根据响应跳过承诺链中的jQuery承诺,javascript,jquery,promise,Javascript,Jquery,Promise,我有一系列jQuery承诺,但我想跳过其中一个,这取决于之前承诺的响应 我的代码类似于: getMoney() .then(getBeer) .then(getFireworks) .then(getLighterfluid) .then(getCrazy); 如果我的getFireworks函数中的承诺返回类似“没有可用的焰火”的内容,那么我想跳过getLighterFluid承诺,然后转到getCrazy 我如何在当前设置中实现这一点?或者我需要重做吗?有很多方法可以解决这
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救护车)
类似但更全面的方法是使用针对该问题提供的任何解决方案。这将允许您在链的任何位置考虑所有/任何以前的异步结果。例如,你可以跟踪每个阶段剩下多少钱并相应地花费,或者根据买了多少啤酒和烟火来确定“疯狂”的程度。