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
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.
pipe() method in jQuery is used to add utility method to filter, chain Deferreds.
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.
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).
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With