2012-08-22 11 views
15

私は、Async Tasksを散らばったパーサを書いています。私は非同期タスクを制御して順序付けるためにJQueryの約束を使用します。これは、コンストラクタ関数の擬似コードバージョンです:

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

、これは例の機能がどのように見えるかです:jQueryのドキュメントから

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

    exampleTask(dfd.reject, dfd.resolve); 

    return dfd.promise(); 
}; 

場合には

複数のDeferredオブジェクトがjQueryに渡されると、 このメソッドは、新しい「マスター」Deferredオブジェクト からPromiseを返します。このオブジェクトは、それが持つすべてのDeferredの集約状態を追跡しますeが渡されました

パーサーの全体的な進捗状況を気にする人には、どのようにして.progress()を使用して通知できますか?例: 私は何をしようとしているとの相続人はフィドル

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

http://jsfiddle.net/ashanova/RjULA/2/

答えて

14

progressCallbacksを呼び出すためにdeferred.notify()を使用してください。たとえば、

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/ –

関連する問題