IT TIP

jQuery Deferred-여러 AJAX 요청이 완료되기를 기다리는 중

itqueen 2020. 12. 28. 22:22
반응형

jQuery Deferred-여러 AJAX 요청이 완료되기를 기다리는 중


이 질문에 이미 답변이 있습니다.

나는 지연된 아약스 호출의 3 계층 딥 체인을 가지고 있으며, 이상적으로는 가장 깊은 계층이 완료 될 때 약속을 끝까지 걷어 낼 것입니다 (저를 Inception의 일로 만듭니다 ... "더 깊이 들어가야합니다!").

문제는 한 번에 많은 ajax 요청 (아마도 수백 개)을 보내고 모든 요청이 완료 될 때까지 연기해야한다는 것입니다. 나는 마지막으로 한 마지막 일을 믿을 수 없습니다.

function updateAllNotes() {
    return $.Deferred(function(dfd_uan) {
        getcount = 0;
        getreturn = 0;
        for (i = 0; i <= index.data.length - 1; i++) {
            getcount++;
            $.when(getNote(index.data[i].key)).done(function() {
                // getNote is another deferred
                getreturn++
            });
        };
        // need help here
        // when getreturn == getcount, dfd_uan.resolve()
    }).promise();
};

.when(), 및 .apply()여러 지연을 사용할 수 있습니다 . 매우 유용합니다.

function updateAllNotes() {
    var getarray = [],
        i, len;

    for (i = 0, len = data.length; i < len; i += 1) {
        getarray.push(getNote(data[i].key));
    };

    $.when.apply($, getarray).done(function() {
        // do things that need to wait until ALL gets are done
    });
}

jQuery.Whendoc 를 참조하면 ajax 호출 중 하나가 실패하면 이후의 fail모든 ajax 호출이 아직 완료되지 않은 경우에도 마스터 콜백이 호출됩니다. 이 경우 모든 통화가 완료되었는지 확신 할 수 없습니다.

결과가 무엇이든 모든 호출을 기다리려면 다음과 같이 다른 Deferred를 사용해야합니다.

$.when.apply($, $.map(data, function(i) {
    var dfd = $.Deferred();
    // you can add .done and .fail if you want to keep track of each results individualy
    getNote(i.key).always(function() { dfd.resolve(); });
    return dfd.promise();
});

답변 brittohalloran에 감사드립니다. 또한 Underscore를 사용하고 있으므로 다음과 같이 맵을 사용하여 솔루션을 매우 깔끔하게 적용 할 수있었습니다.

$.when.apply($, _.map(data, function(i) {
    return getNote(i.key);
})).done(function() {
    alert('Be Happy');
});

유용합니다.

참조 URL : https://stackoverflow.com/questions/6538470/jquery-deferred-waiting-for-multiple-ajax-requests-to-finish

반응형