假设我有多个函数 func1
、func2
、func3
等......
它们都包含一个 AJAX/async 函数:
函数 funcX(){
//一些ajax请求
}
如果在主函数中,我依次调用 func1
、func2
、func3
,如下所示:
$(document).ready(function(){
func1();
func2();
func3();
...
}
每个 ajax/async 函数的调用是否一定会按其父函数的顺序执行?起初我认为它们可能是,但我的程序的行为似乎暗示并非如此......
如果没有,是否有一个好的(希望简单?)替代长链回调的方法?
最佳答案
Will each ajax/async function's call be certain to execute in the order of their parent functions?
它们应该按顺序执行,但它们的内部回调可以按任何顺序调用。
If not, is there a good (hopefully simple?) alternative to having a long chain of callbacks?
你可以使用 promise ,并在 promise 已解决时执行下一个功能。
这个例子使用了 jQuery...
var fn1 = function () {
var d = $.Deferred();
setTimeout(function () {
$("body").text("Callback 1 done.") && d.resolve();
}, Math.random() * 1300 + 800);
return d.promise();
};
var fn2 = function () {
var d = $.Deferred();
setTimeout(function () {
$("body").text("Callback 2 done.") && d.resolve();
}, 500);
return d.promise();
};
$.when(fn1(), fn2()).then(function () {
setTimeout(function () {
$("body").text("All done.");
}, 300);
});
jsFiddle .
我们使用 $.when()
并将我们要执行的调用函数传递给它。然后我们使用 then()
来显示最终消息(我在这里放置了一个 setTimeout()
以便您可以在文档中看到最后解析的函数的消息)。
这些函数中的每一个都有自己的返回 promise 的延迟对象。为举例起见,setTimeout()
模拟 XHR。执行此回调时,我们解析延迟对象。
一旦两者都被推迟,我们就会到达 then()
的回调。
关于javascript - 在不同函数中调用异步函数是否仍会导致异步行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17438289/