Мониторинг $.Deferred прогресса с несколькими параллельными запросами веб-сервиса

Я хочу сделать один синхронный вызов веб-службы, а затем несколько параллельных вызовов и завершить последний синхронный вызов, когда параллельные задачи завершатся. Я изучал $.Deferred и понимаю его концептуально, но не могу найти правильный синтаксис для этого. Я знаю, что в этом коде есть несколько ошибок, которые пытаются сделать три последовательных вызова. Код checkProgress никогда не вызывается.

function doSequential(a, b, c) {
    report("Starting Sequential Test");
    process("A", urlDo, a, '#spnA');
    process("B", urlDo, b, '#spnB');
    process("C", urlDo, c, '#spnC');
}

function process(id, url, size, selector) {
    var data = JSON.stringify({ id: id, size: size });
    var deferred = $.Deferred();
        deferred.promise = $.ajax({
            url: urlDo,
            data: data,
            type: "Post",
            contentType: 'application/json; charset=utf-8',
            dataType: "json"
        });
    deferred.then(
        function (response) {
            // Done
            $("#spn" + id).append("Done");
            report(id + " done");
            return
        },
        function (error) {
            // Fail
            $("#spn" + id).append("Error: " + error);
            report(id + " error: " + error);
            return;
        },
        function (data) {
            // Notify progress
            var check = setInterval(function () {
                var done = checkProgress(id);
                if (done) {
                    clearInterval(check);
                    return;
                }
            }, 1000);
            return;
        });
}

function checkProgress(id) {
    var data = JSON.stringify({ id: id });
    var status = ajaxCall(urlCheck, data);
    if (status) {
        $("#status" + id).text(status.count + " of " + status.size);
        report(status.message);
        return status.done;
    }
    report("checkProgress failed");
    return true;
}

1 ответ

$.ajax() не вызывает внутренний метод для уведомления.

$.ajax(). progress (function () {...}) не будет вызван.

Я думаю, что этот пример поможет вам понять отложенный объект и использовать его для решения вашей проблемы.

function process(selector, url) {

    var post = new MockPost(url);

    var promise = post.start();

    promise.done(function() {
        $(selector).text("OK");
    })
    .fail(function() {
        $(selector).text("FAIL");
    })
    .progress(function(progressStr) {
        $(selector).text(progressStr + "%");
        $(selector + "_progress").attr("value", progressStr);
    });

    return promise; 
}

// Clear texts fields
$("span").text = "";

// Launch three parallels tasks 
$.when(process("#spnA", "urlA"), process("#spnB", "urlB"), process("#spnC", "urlC"))
.done(function() {
    // Print OK when all parallels tasks have finished
    $('#global').text("OK");
})
.fail(function() {
    // Print FAIL if some task fails
    $('#global').text("FAIL");
});

-> Jsfiddle здесь: http://jsfiddle.net/UZzeC/

Другие вопросы по тегам