2012-08-22 45 views
15

我正在寫一個解析器,散佈着異步任務。我使用JQuery承諾來控制和排序異步任務。這是構造函數的僞代碼版本:

/** 
    * @constructor 
    */ 
    function Parser(json) 
    { 
     return $.when(
      this.delete().then(this.insert(json)), 
      this.doSomething(), 
      this.doSomethingElse().then(this.update(json)) 
     ) 
    }; 

,這是一個例子功能是什麼樣子:

Parser.prototype.doSomething = function() 
{ 
    var dfd = $.Deferred(); 

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

從jQuery文檔:

的情況下將多個Deferred對象傳遞給jQuery.When, 該方法從一個新的「主」延遲對象 返回Promise,該追蹤對象追蹤它具有b的所有延遲的聚合狀態een passed

我該如何使用.progress()來通知任何關心解析器整體進度的人? 例如

var parser = new Parser(json); 
parser.progress(function(prog){console.log(prog}); 

繼承人什麼,我試圖做一個小提琴: http://jsfiddle.net/ashanova/RjULA/2/

回答

14

使用deferred.notify()調用progressCallbacks。例如:

function doSomething() { 
    var dfd = $.Deferred(); 

    var count = 0; 
    var intervalId = setInterval(function() { 
     dfd.notify(count++); 
     count > 3 && clearInterval(intervalId); 
    }, 500); 

    return dfd.promise(); 
}; 

var promise = doSomething(); 

promise.progress(function(prog) { 
    console.log(prog); 
});​ 

DEMO

+0

我想出瞭如何在函數中使用.notify(如在你的演示中),但是我想把它傳遞迴構造函數並通知從那裏開始的整體進度。我想看看解析器在哪裏,而不是它的功能 - 如果你跟着我? – JonWells

+0

@Jaoa是這樣的:http://jsfiddle.net/ashanova/RjULA/2/ – JonWells

+0

@CrimsonChin:不知道我是否正確理解了你的問題,但在這種情況下,你需要創建並存儲一個引用到構造函數中的'$ .Deferred',這樣你就可以在每個方法中調用'notify'。東西沿着這些線:http://jsfiddle.net/B7nzy/ –