继续jQuery延迟链的失败

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呢?似乎任何延迟的失败都会导致链的其余部分也失败.相反,我想记录错误并继续列表的其余部分.

Ber*_*rgi 5

使用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)