我们说我有多种功能func1
,func2
,func3
等.....
它们都包含一个AJAX /异步函数:
function funcX(){
// some ajax request
}
如果在主要功能中,我按顺序呼叫func1
,func2
,func3
:
$(document).ready(function(){
func1();
func2();
func3();
...
}
每个ajax / async函数的调用肯定会按其父函数的顺序执行吗?起初我以为它们可能是,但我的程序的行为似乎在暗示......
如果没有,是否有一个好的(希望简单?)替代长链回调?
答案 0 :(得分:3)
每个ajax / async函数的调用肯定会按其父函数的顺序执行吗?
它们应该按顺序执行,但可以按任何顺序调用它们的内部回调。
如果没有,是否有一个好的(希望简单?)替代长链回调?
您可以使用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);
});
我们使用$.when()
并将我们想要执行的调用函数传递给它。然后我们使用then()
显示最终消息(我在此处放置了setTimeout()
,以便您可以在文档中看到最后解析的函数的消息。)
这些函数中的每一个都有自己的延迟对象,它返回promise。例如,setTimeout()
嘲笑XHR。执行此回调时,我们将解析延迟对象。
一旦延迟,我们就会收到then()
的回调。
答案 1 :(得分:1)
为了序列化任务,我编写了一个辅助函数,也可以在我的earlier answer中找到:
function serializeTasks(arr, fn, done)
{
var current = 0;
fn(function iterate() {
if (++current < arr.length) {
fn(iterate, arr[current]);
} else {
done();
}
}, arr[current]);
}
它需要一个值数组(在您的情况下,它们实际上是函数),循环函数和完成处理程序。下面是循环函数:
function loopFn(nextTask, fn)
{
fn(nextTask);
}
它接受一个中间完成函数作为第一个参数和上述数组的每个元素。
设置动态:
serializeTasks([func1, func2, func3], loopFn, function() {
console.log('all done');
});
使用单个参数调用函数,该参数应传递给AJAX成功回调,例如
func1(nextTask)
{
$.ajax({
...,
success: nextTask
});
}
答案 2 :(得分:0)
返回异步结果的顺序不确定,每次都可能会谨慎。
func2可能在func1等之前完成
确保正确的执行顺序非常重要。一种模式是在前一个函数
的成功回调中调用下一个函数例如:
$.get("/someUrl",function(){
$.get("/nextAjaxCall", function(){
.....
});
});
如果依赖链非常简单,我认为没有必要引入一个框架来处理这个
答案 3 :(得分:0)
或者看看异步库,真棒!