Reading a JSON-Service like this:
$.ajax({
url:\'activeIDs\',
success : function(data){ // data = [14,15]
var tableRows = [];
for (var dataIndex=0; d
You'll need to wait for all requests to finish before alert
ing.
$.ajax({
url:'activeIDs',
success : function(data){ // data = [14,15]
var tableRows = [];
var requests = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
var isLast = dataIndex == data.length;
var request = $.ajax({
url: 'info?id=' + data[dataIndex]
}).done(function(data2) { // "foo", "bar"
tableRows.push(data2.name);
});
requests.push(request);
}
// wait for all requests to finish here
$.when(requests).then(function(){
// all success functions have been called and updated things appropriately
alert(tableRows.length);
}
}
});
This assumes that all requests succeed. It also looks like there are a few typos
tableRows
get updated?entries
defined?Edit
Now using promise style success handler. Should push the result in to tableRows
before calling the $.when().then
callback
Use jQuery when
// Function to return id info based on this example http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success
function getInfo(ID) {
return $.get("info?id=" + ID);
}
// based on examples from https://api.jquery.com/jQuery.when/
var promises = [];
var jqxhr = $.get("activeIDs")
.done(function(data) {
$.each(data,function(i,v) {
promises.push(getInfo(v));
});
$.when(promises).done(function(p) {
console.log(p,p.length);
});
})
.fail(function() {
alert( "Error" );
});
Why do you want $.Deferred ? Your $.ajax calls are returning a promise, so, you can use it:
var promisesArray = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
promisesArray.push($.ajax({...}));
}
$.when.apply($, promisesArray).then(...);
(inspired by this answer)
You can use deferreds by taking this solution and passing it to a deferred if you want, but it's not neccesary:
var x = $.Deferred(function(defer){
var promisesArray = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
promisesArray.push($.ajax({...}));
}
$.when.apply($, promisesArray).done(function(data) { defer.resolve(data); });
});
return x.promise();
(Not tested, I'm sorry)