4

動的非同期リクエスト(ajaxを使用したjsfiddleの場合)を受け取りました。これは、成功または失敗に関係なく待機する必要があります。つまり、一部のリクエストが失敗した場合でも、すべてのプロセスが終了したことを知る必要があるだけです。

//動的:私の場合、これはajaxリクエストによって生成されるため、フォローアップ非同期リクエストの数は柔軟です

だから私はもともとこのコードを使用しました:

    $.when.apply($,deferreds).done(function() {
        $("div").append("<p>All done!</p>");
    }).fail(function(){
        $("div").append("<p>Something failed!</p>");
    });

ただし、延期されたものの1つが失敗したシナリオでは、失敗コールバックがすぐに呼び出されます。それをalways()に変更しようとしましたが、結果は次のようになります。

Uncaught TypeError:オブジェクト#にはメソッドがありません'常に'

では、どうすればこれに対してalways()のようなソリューションを実装できますか?

フィドル

私の元のソース:jQueryDeferred-複数のAJAXリクエストが終了するのを待っています

4

2 に答える 2

9

またはに$.Deferred関係なくリストが終了するのを待ちたいだけの場合は、元のソースjQuery Deferredの私の答えに解決策があります-複数のAJAXリクエストが終了するのを待っていますrejectedresolved

$.when.apply($, $.map(deferreds, function(d) {
    var wrapDeferred = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    d.always(function() { wrapDeferred.resolve(); });
    return wrapDeferred.promise();
}));
于 2013-02-14T09:54:36.500 に答える
0

ケビンBが提案したようにわかりました。非同期リクエストの結果に関係なく解決されるカスタム遅延を使用しました。

var deferreds = $.map(i, function (count, index){
    var waitingProcess = new $.Deferred(); //Here is the custom deferred
    if(count == 7) {
        $.Deferred().fail(function(){
            $("div").append("<p>Task #" + count + " failed.");
            waitingProcess.resolve(); //resolve it no matter the outcome
        }).reject();
    }else{
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
            waitingProcess.resolve(); //resolve it no matter the outcome
        });
    }
    return waitingProcess.promise();
});

フィドル

于 2013-02-13T04:34:50.613 に答える