I just started using promises for multiple ajax calls that I will not know how many I need to create. I have found these posts:
jQuery Deferred - waiting for multiple AJAX requests to finish jQuery make dynamic ajax calls and wait for them to complete
So I tried to play with promises and in this simple example:
function doSomething1() {
var deferred1 = $.Deferred();
setTimeout(function() {
deferred1.resolve();
}, 2000);
return deferred1.promise();
}
function doSomething2() {
var deferred2 = $.Deferred();
setTimeout(function () {
deferred2.resolve();
}, 1000);
return deferred2.promise();
}
var promise = doSomething1();
var promise2 = doSomething2();
function multiplePromises() {
var promises = [];
for (var i = 0; i < 3; i++) {
var deferred = $.Deferred();
deferred.resolve();
promises.push(deferred);
}
return $.when.apply(undefined, promises).promise();
}
multiplePromises().done(function () {
console.log("yay");
});
I get "yay" right away. Now to simulate an ajax call, I tried to use setTimeout
. Like this:
function multiplePromises2() {
var promises = [];
for (var i = 0; i < 3; i++) {
setTimeout(function () {
var deferred = $.Deferred();
deferred.resolve();
promises.push(deferred);
},2000);
}
return $.when.apply(undefined, promises).promise();
}
multiplePromises2().done(function () {console.log("timeout and promises");});
I don't get the actual two seconds delay. If I try this:
function multiplePromises2() {
var promises = [];
for (var i = 0; i < 3; i++) {
var deferred = $.Deferred();
setTimeout(function () {
deferred.resolve();
},2000);
promises.push(deferred);
}
return $.when.apply(undefined, promises).promise();
}
I never get the message at all that multiplePromises2 was finished. So in my actual ajax call, I was not able to use deferred. I tried doing it like this:
saveNewProjects(projects) {
var projectPromises: any[] = [];
for (var projectName in projects) {
var project = projects[projectName][0].Project;
if (project && project.id == 0 && project.name !== null) {
var deferred = $.Deferred();
var postProject = $.ajax({
url: "projects",
contentType: "application/json",
type: "POST",
data: JSON.stringify(project),
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors,
},
success: function (data) {
deferred.resolve(data);
},
});
projectPromises.push(postProject);
}
}
return $.when.apply($, projectPromises).promise();
}
I call that function like this:
this.saveNewProjects(projects).then(() => {
Am I thinking about promises and deferred properly? It doesn't seem to get to my then or done callbacks. Thanks in advance.