jQuery承诺,如何检查then()是否真的在when()之后?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jQuery承诺,如何检查then()是否真的在when()之后?相关的知识,希望对你有一定的参考价值。
这可能只是我在艰难的过程中学到的一课,但我只想与大家一起确认。
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>
以上是关于jQuery承诺,如何检查then()是否真的在when()之后?的主要内容,如果未能解决你的问题,请参考以下文章