Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
61
rated 0 times [  62] [ 1]  / answers: 1 / hits: 22293  / 11 Years ago, thu, november 21, 2013, 12:00:00

If I want to have synchronous and asynchronous functions execute in a particular order I could use jQuery promise but it doesn't seem to work the way I'd expect it to work.



Functions a,b and c should execute in that order when in a the deferred.resolve() is called I'd expect function b to be executed but all functions are executed immediately no matter if the resolve is called.



Here is the code:



function a(){
var deferred = $.Deferred();
setTimeout(function(){
console.log(status in a:,deferred.state());
//this should trigger calling a or not?
deferred.resolve(from a);
},200);
console.log(a);
return deferred.promise();
};
function b(){
var deferred = $.Deferred();
setTimeout(function(){
console.log(status in b:,deferred.state());
deferred.resolve(from b);
},200);
console.log(b);
return deferred.promise();
}
//synchronous function
function c(){
var deferred = $.Deferred();
console.log(c);
console.log(status in c:,deferred.state());
deferred.resolve(from c);
return deferred.promise();
}
function test(){
fn=[a,b,c],i=-1,
len = fn.length,d,
d = jQuery.Deferred(),
p=d.promise();
while(++i<len){
p=p.then(fn[i]);
}
p.then(function(){
console.log(done);
},
function(){
console.log(Failed);
});
d.resolve();
//instead of the loop doing the following has the same output
//p.then(a).then(b).then(c);
//d.resolve();
}
test();


Output is:



a
b
status in c: pending
c
done
status in a: pending
status in b: pending


Expected output:



a
status in a: pending
b
status in b: pending
c
status in c: pending
done


Tried a some combinations of the following modifications:



  d = jQuery.Deferred();
setTimeout(function(){d.resolve();},100);
var p=d.promise();
while(++i<len){
p.then(fn[i]);
}


But all with same unexpected results, b gets called before deferred of a is resolved, c is called before deferred of b is resolved.


More From » jquery

 Answers
24

For jQuery prior to 1.8, this is a problem, but for new versions of jQuery, this is not a problem anymore:



function test(){
var d = jQuery.Deferred(),
p=d.promise();
//You can chain jQuery promises using .then
p.then(a).then(b).then(c);
d.resolve();
}
test();


DEMO



Below is the demo of jQuery 1.7.2



DEMO


[#74139] Wednesday, November 20, 2013, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
bradleymoisesy

Total Points: 121
Total Questions: 105
Total Answers: 95

Location: Nepal
Member since Mon, Jan 4, 2021
3 Years ago
;