5

以下のコードを使用して、複数の URL から JSON を取得しています。ただし、URL の 1 つが失敗したか、404 応答を取得した場合、実行機能は機能しません。私はjquery docを読んで、呼び出しの1つが失敗しても「then」が実行されるべきであることを知っています。

var data = {};
var calls = [];
for (var i in funcs) {
    calls.push(
        $.getJSON(base_url+i,
            (function(i) {
                return function(d) {
                    data[i] = d;
                };
            }(i)) 
        )
    );
}
$.when.apply($,calls).then(function() {
    do_something(data);
}); 
4

4 に答える 4

5

メソッドを参照してくださいalwaysどちらの場合も実行されます。例えば:

$.when.apply($, calls).always(function() { 
    alert('Resolved or rejected'); 
});

成功したトランザクションへの応答では、引数は .done() (つまり、a = データ、b = jqXHR) と同じであり、失敗したトランザクションの場合、引数は .fail() (つまり、a = jqXHR、b = errorThrown) と同じです。(c)

于 2013-07-29T15:15:51.550 に答える
3

私はjquery docを読んで、呼び出しの1つが失敗しても「then」が実行されるべきであることを知っています。

いいえ、渡されたすべてのオブジェクトが満たされた場合にのみ、promiseが満たされます。そのうちの 1 つが失敗した場合、結果は拒否されます。

do_something(data); を作成する方法はありますか? 失敗したかどうかに関係なく実行します。

使用できます.always

// doSomething waits until all are fulfilled or one is rejected
$.when.apply($,calls).always(do_something);

それでも、Q の場合のように、すべてが解決されたときにコールバックを実行することをお勧めしますcalls(満たされるか拒否されるかに関係なく) allSettled。jQuery では、少し回避する必要があります。

var calls = $.map(funcs, function(_, i) {
    var d = new $.Deferred;
    $.getJSON(base_url+i).done(function(r/*…*/) {
        d.resolve(i, r);
    }, function(/*…*/) {
        d.resolve();
    });
    return d.promise();
});
$.when.apply($, calls).then(function() {
    var data = {};
    for (var i=0; i<arguments.length; i++)
        data[arguments[i][0]] = arguments[i][1];
    do_something(data);
}); 
于 2013-07-29T15:16:15.317 に答える