Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery deferred - do I need pipes or chains to achieve this pattern?

I'm trying to implement the folowing scenario, using JQuery deferred, without much luck.

What parts of the deferred api would you use, and how would you structure your calls to achieve the following:

1st ajax callA to serviceA retrieve a list of Ids

wait until this call returns

then n ajax calls to serviceB, each call using a using an Id from the list returned by callA

wait until all serviceB calls have returned

then a final ajax call to serviceC

like image 415
zadam Avatar asked Jul 11 '11 08:07

zadam


People also ask

What does JQuery Deferred do?

Deferred() method in JQuery is a function which returns the utility object with methods which can register multiple callbacks to queues. It calls the callback queues, and relay the success or failure state of any synchronous or asynchronous function.

What is pipe in JQuery?

pipe() method in jQuery is used to add utility method to filter, chain Deferreds.

What is JQuery deferred and promise object?

A deferred object is an object that can create a promise and change its state to resolved or rejected . Deferreds are typically used if you write your own function and want to provide a promise to the calling code. You are the producer of the value. A promise is, as the name says, a promise about future value.

How do I use Javascript deferred?

If the defer attribute is set, it specifies that the script is downloaded in parallel to parsing the page, and executed after the page has finished parsing. Note: The defer attribute is only for external scripts (should only be used if the src attribute is present).


1 Answers

You could do like this (more or less pseudocode):

(function() {
    // new scope
    var data = []; // the ids coming back from serviceA

    var deferredA = callToServiceA(data); // has to add the ids to data

    deferredA.done(function() { // if callToServiceA successful...
        var deferredBs = [];

        for i in data {
            deferredBs.push(callToServiceB(...));
        }

        $.when.apply($, deferredBs).then(callToServiceC); 
    });

}());

The callToServiceX function should return the promise object returned by $.ajax.

There might be a "cleaner" solution than having data in a shared scope, with resolve, but the setup would be a bit more difficult (and not necessarily more readable).

like image 172
Felix Kling Avatar answered Sep 28 '22 17:09

Felix Kling