1

I'm wondering what would be the best design for chaining Deferreds. Please consider the following snippet:

Component X:

_functionRaisingEvent: function()
{
    $.when(this.raiseEvent('myEvent', args)).done(function(args){ // Check for args.cancel });
},

_raiseEvent: function(event, args)
{
    var def = new $.Deferred();

    // Call subscribers of myEvent in different components and pass them args
    // Subscribers possibly make ajax calls

    return def.promise();
},

Subscriber Y:

_onMyEvent:function(args)
{
    $.ajax(....).done(function(data){ if(data == 1) args.cancel = true;});
},

Subscriber Z:

_onMyEvent:function(args)
{
    document.getElementById('abx').display = 'block';
}

_functionRaisingEvent calls _raiseEvent which fires the callbacks of the subscribers.

What I’d like to achieve is, that the callback of done in _functionRaisingEvent is only executed after all subscribers finished.

Should I pass the subscribers their own Deferred as argument and use pipe? Is the any best practice or design pattern?

4

1 に答える 1

0

重要なのはこの部分を変更することです

_raiseEvent: function(event, args) {
    var def = new $.Deferred();
    //Call subscribers...
    return def.promise();
}

... 1つだけではなく、延期されたコレクションを返し、これらをコレクションとしてに渡し$.whenます。$.whenはコレクションを受け入れず、オブジェクトが個別の引数として渡されることを要求するため、一般的な回避策は、すべての関数によって継承されたメソッドを介して呼び出すことです$.whenapply()

_raiseEvent: function(event, args) {
    var def = new $.Deferred();
    //Call subscribers... - let's assume each returns an AJAX object
    var result_subscr1 = call_subscriber_1();
    var result_subscr2 = call_subscriber_2();
    return [def.promise(), result_subscr1, result_subscr2];
}

...そして現在$.when()

$.when.apply(null, this.raiseEvent('myEvent', args)).done(...

次に、各延期の結果がdone()、オブジェクトが渡された順序でコールバックに渡されます$.when()

于 2012-06-29T16:08:11.103 に答える