在不同的函数中调用异步函数是否会导致异步行为?

时间:2013-07-03 01:18:22

标签: javascript ajax function asynchronous

我们说我有多种功能func1func2func3等.....

它们都包含一个AJAX /异步函数:

function funcX(){ // some ajax request }

如果在主要功能中,我按顺序呼叫func1func2func3

$(document).ready(function(){ 

      func1();
      func2();
      func3();
      ...
}

每个ajax / async函数的调用肯定会按其父函数的顺序执行吗?起初我以为它们可能是,但我的程序的行为似乎在暗示......

如果没有,是否有一个好的(希望简单?)替代长链回调?

4 个答案:

答案 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);
});

jsFiddle

我们使用$.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)

或者看看异步库,真棒!

async