我有一系列jQuery承诺,但我想跳过其中一个,取决于先前承诺的响应。
我的代码类似于:
getMoney()
.then(getBeer)
.then(getFireworks)
.then(getLighterfluid)
.then(getCrazy);
如果我的getFireworks函数中的promise返回“No fireworks available”之类的内容,那么我想跳过getLighterFluid承诺,然后转到getCrazy。
我如何使用当前的设置来解决这个问题?或者我需要重做这个吗?
答案 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
}