根据响应跳过承诺链中的jQuery承诺
Skip a jQuery promise in a chain of promises depending on response
我有一个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
,并使代码具有很强的描述性。
相关文章:
- JQuery 承诺异步对话
- JQuery 承诺已经包含回调的函数
- 在jQuery中,.state()如何确定一个承诺是挂起的、已解决的还是被拒绝的
- jQuery在一系列承诺上出现问题
- JQuery 承诺:访问外部变量或将结果传递给 .done 内部的 IIFE
- jQuery ajax 请求与承诺在IE9中不起作用
- 使用动态构建的 jQuery 承诺链按顺序激活特定元素
- jQuery 承诺是否符合 Promises/A+
- jquery承诺和骨干的问题
- 如何在jquery中链接这些效果?队列?承诺
- 多个条件异步递归函数和 jQuery 承诺
- 随之而来的 jquery 承诺
- 使用 jQuery 承诺等待转换
- jQuery 承诺(当>时)不适用于使用 $.each 和 $.ajax 遍历数组
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- 承诺 jquery 中的变量范围
- 延期承诺&;Jquery
- 使用模式承诺jquery将异步函数更改为同步函数
- 将一个简单的ajax调用转换为使用承诺jQuery/AngularJS
- 使用承诺jQuery