Мониторинг $.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/