Reuse Delayed more than once

I use delay because I need to execute several processes asynchronously.

To be more clear, here is the meaning of my treatments:

  • Cure1: calling ajax service granting user rights
  • Cure 2: Call the ajax service, which provides links and tags.

I need to call these 2 services at the same time, and then get a single response from both services in order to display links depending on the rights (my real problem is with the 3rd ajax service, but let me only talk with 2 to simplify).

First I declare a deferred global var:

var treatment1 = $.Deferred();
var treatment2 = $.Deferred();

Then, when I need to complete the task, I call the resolution method with the necessary data to use it in a globally unique call:

  • when my first ajax service answers: treatment1.resolve(responseData1)
  • ajax: treatment2.resolve(responseData2)

1 2 , :

$.when(treatment1, treatment2).done(function(responseData1,responseData2) {
    DoGlobalTreatmentWithAllResponseData(responseData1,responseData2)
}

, .

ajax , .

. , ajax . .

, . , , , .

reset reset promises ( , AOP - )?

, ? , ( , ), responseData .

, : http://jsfiddle.net/PLce6/14/

, .

.

+4
3

/ ... , , , ...

, ... , :

var:

var treatment1 =$.Deferred(); 
var treatment2 = $.Deferred();

,

:

function onClick() {
    var treatment1 =$.ajax({url: '/call1'}); 
    var treatment2 = $.ajax({url: '/call2'});
    $.when(treatment1, treatment2).done(function(obj1, obj2) {
            // do whatever else you need
    });
}

, , , , , .

, , .

op , . , $.when . . http://jsfiddle.net/PLce6/15/

// global
var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();

// here the reset 
function resetDeferreds() {
d1 = $.Deferred();
d2 = $.Deferred();
d3 = $.Deferred();
$.when(d1, d2, d3).done(
    function (responseData1, responseData2, responseData3) {
       DoGlobalTreatmentWithAllResponseData(responseData1, responseData2, responseData3);
    resetDeferreds();
});

// the onclick handlers
function do3() {
d3.resolve('do3 ');
return d3;
}

// the top level $.when
$.when(d1, d2, d3).done(function (responseData1, responseData2, responseData3) {
    DoGlobalTreatmentWithAllResponseData(responseData1, responseData2, responseData3);
    resetDeferreds();
});
+3

, ?

, . Deferred .

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

    setTimeout(function () {
        d.resolve();
    }, 1000);

    return d;
}

function doSomethingElse() {
    var d = $.Deferred();

    setTimeout(function () {
        d.resolve();
    }, 1000);

    return d;
}

:

$.when(doSomething(), doSomethingElse()).done(function () {
    console.log('done');
});

:

resolve Deferred, Deferred , DeferredWrapper, API, Deferred, Deferred.

, DeferredWrapper (, done, always, fail...), . DeferredWrapper [functionName, arguments] this._actions.

, (, reject, resolve, resolveWith... ..), :

  • d - Deferred, this._deferred.

  • fn - .

  • d.state() :

    3.1 Do d = this._deferred = [[native jQuery Deferred]]

    3.2 d.

  • d[fn].apply(d, arguments)

. promise , . , , .

+1

. , , - , 1 2 . , @raghu @juan-garcia

function onClick() {
    var treatment1 =$.ajax({url: '/call1'}); 
    var treatment2 = $.ajax({url: '/call2'});
    $.when(treatment1, treatment2).done(function(obj1, obj2) {
            // do whatever else you need
    });
}

, :

var treatment1 =$.ajax({url: '/call1'}); 
var treatment2 = $.ajax({url: '/call2'});

function onClick() {
    $.when(treatment1, treatment2).done(function(obj1, obj2) {
            // do whatever else you need
    });
}

- . . - , , . . , , . . , , .

javascript JSFiddle, , , , . . , , , , . , . . $.when(). done() , , when().

0

All Articles