2013-05-30 16 views
1

我想要在并行任务完成时完成一个同步webservice调用,然后进行多个并行调用并完成最终同步调用。我一直在研究$。从概念上推断和理解它,但无法找到正确的语法来做到这一点。我知道在这段代码中有很多错误尝试进行三次连续调用。 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

$就已经默认返回一个承诺,没有必要创造一个又一个? – adeneo

+0

“同步Web服务调用”? –

回答

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/