Ответ, который дал cdr, который имеет самый высокий голос в данный момент, неверен.
Когда у вас есть функции a, b, c, каждый возвращает объект $ .Deferred () и цепочку функцийкак показано ниже:
a().then(b).then(c)
И b, и c будут выполняться после разрешения обещания, возвращенного из a.Так как обе функции then () связаны с обещанием a, это работает подобно другим цепочкам Jquery, таким как:
$('#id').html("<div>hello</div>").css({display:"block"})
, где функции html () и css () вызываются для объекта, возвращаемого из$ ('# id');
Таким образом, чтобы выполнить a, b, c после разрешения обещания, возвращенного предыдущей функцией, вам необходимо сделать следующее:
a().then(function(){
b().then(c)
});
Здесьвызов функции c привязан к обещанию, возвращенному функцией b.
Вы можете проверить это, используя следующий код:
function a() {
var promise = $.Deferred();
setTimeout(function() {
promise.resolve();
console.log("a");
}, 1000);
return promise;
}
function b() {
console.log("running b");
var promise = $.Deferred();
setTimeout(function () {
promise.resolve();
console.log("b");
}, 500);
return promise;
}
function c() {
console.log("running c");
var promise = $.Deferred();
setTimeout(function () {
promise.resolve();
console.log("c");
}, 1500);
return promise;
}
a().then(b).then(c);
a().then(function(){
b().then(c)
});
Измените обещание в функции b () с resol () отклонить (), и вы увидите разницу.