2013-05-30 4 views
1

Я хочу сделать один синхронный вызов webservice, а затем несколько параллельных вызовов и завершить окончательный синхронный вызов при завершении параллельных задач. Я изучал $ .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; 
} 
+0

$ .ajax уже возвращает обещание по умолчанию, нет необходимости создавать еще один? – adeneo

+0

"синхронный вызов webservice"? –

ответ

2

$ .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/

Смежные вопросы