这可能只是我在艰难的过程中学到的一课,但我只想与大家一起确认。
function a() {
var dtd = $.Deferred();
console.log('a');
setTimeout(() => {
dtd.resolve();
}, 5000);
return dtd.promise();
}
function b() {
var dtd = $.Deferred();
console.log('b');
setTimeout(() => {
dtd.resolve();
}, 5000);
return dtd.promise();
}
$.when(a()).then(b()).done(function () {console.log('c');});
延迟后只打印c
,a
和b
不是。 JSFiddle。
它是这样的吗?谢谢。
$.when()
的论据应该是一个承诺 - 你做对了,因为a()
回归了一个承诺。
但是.then()
实际上把一个函数作为参数。也就是说,你应该通过b
,而不是b()
的结果。
表达式.then(b())
马上执行b()
,所以它不会等到5s,直到a()
的承诺得到解决。当你有.then(b)
时,调用b()
只会在a()
的承诺得到解决后发生,这就是你想要的。
所以只需将.then(b())
更改为.then(b)
就会按预期运行(打印a
,等待5s,打印b
,再等5s,打印c
):
function a() {
var dtd = $.Deferred();
console.log('a');
setTimeout(() => {
dtd.resolve();
}, 5000);
return dtd.promise();
}
function b() {
var dtd = $.Deferred();
console.log('b');
setTimeout(() => {
dtd.resolve();
}, 5000);
return dtd.promise();
}
$.when(a()).then(b).done(function () {console.log('c');});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>