Cob*_*ger 5 javascript jquery deferred jquery-deferred
我正在使用通常的Deferred链接方法在jQuery中进行一系列顺序AJAX调用.第一个调用返回一个值列表,随后的调用将返回那些返回的列表条目.在第一次返回列表的调用之后,后续调用可以按任何顺序完成,但必须一次完成一次.所以这就是我使用的:
$.when(callWebService()).then(
function (data) {
var looper = $.Deferred().resolve(),
myList = JSON.parse(data);
for (var i in myList) {
(function (i) {
looper = looper.then(function () { // Success
return callWebService();
},
function (jqXHR, textStatus, errorThrown) { // Failure
if (checkIfContinuable(errorThrown) == true)
continueChain();
else
failWithTerribleError();
});
})(i);
}
});
Run Code Online (Sandbox Code Playgroud)
事实证明,后续调用有时可能会失败,但我仍然希望进行剩余的调用.在我的列表中,这就是这一点创造性伪代码的意图:
if (checkIfContinuable(errorThrown) == true)
continueChain();
else
failWithTerribleError();
Run Code Online (Sandbox Code Playgroud)
我怎么实现continueChain呢?似乎任何延迟的失败都会导致链的其余部分也失败.相反,我想记录错误并继续列表的其余部分.
使用Promises/A +就像这一样简单
promise.then(…, function(err) {
if (checkIfContinuable(err))
return valueToConinueWith;
else
throw new TerribleError(err);
})
Run Code Online (Sandbox Code Playgroud)
不幸的是,jQuery仍然不符合Promise/A +,并转发旧值(结果或错误) - 除非你从回调中返回一个延迟的jQuery.这与从成功处理程序拒绝的方式相同:
jDeferred.then(…, function(err) {
if (checkIfContinuable(err))
return $.Deferred().resolve(valueToConinueWith);
else
return $.Deferred().reject(new TerribleError(err));
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2276 次 |
| 最近记录: |