多次调用异步函数

时间:2013-04-30 08:11:23

标签: javascript

我有一个异步功能

function AsyncFunc(args){
    //does some async work here
}

然后我在for循环中多次调用此函数:

for(var i=0; i<10; i++)
{
    AsyncFunc(i);
}

这会创建AsyncFunc的多个副本吗?或AsyncFunc中定义的局部变量是否被后续调用覆盖?

修改

假设AsyncFunc执行以下操作:

function AsyncFunc(args){
    $.get(args.url, function(data){
        args.data = data;
    });
}

然后我在for循环中多次调用此函数:

for(var i=0; i<10; i++)
{
    AsyncFunc(args_object_with_a_different_url);
}

现在data会进入相应的args对象吗?换句话说,回调会附加到启动ajax请求的函数的副本吗?

1 个答案:

答案 0 :(得分:1)

AsynFunc()被放置在调用堆栈上10次。每个调用都包含其中定义的所有变量和函数的本地化副本。因此,他们不共享状态和“获得重写”。

除了对全局名称空间中的对象的任何引用之外,调用彼此不共享任何状态。

修改

他们可能“分享”的例子:

var mySharedVariable = 0;

function AsyncFunc(args) {
    var myLocalVariable = mySharedVariable++;
    console.log(myLocalVariable);
   // do some asynchronous task that i'm too lazy to code for the example as it's not relevant
}

for(var i = 0; i < 10; i++)
    AsyncFunc(i);

console.log(mySharedVariable);

正如你在这里看到的,如果我们在结尾处输出mySharedVariable,它将输出10.但是,如果我们输出myLocalVariable,我们会看到类似于0,1,2的东西, 3,4,5,6,7,8,9,因为它们是局部变量,不共享状态。

修改

jQuery异步调用示例:

for (var i = 0; i < 10; i++)
     $.post('someURL', function(response) {
         var myLocalVariable = response.data;
         //the data returned is not a copy, it's an individual instance per call invoked.
         //neither is myLocalVariable shared, each invocation of this callback has it's own memory allocated to store its value
     });

修改 对于您最近的问题,每个data对象在获取请求后对每个回调都是唯一的。但是,您的代码并不能保证每次传入的args变量都不同,因此您的实现可能会导致args.data被每个回调覆盖。所以请看下面的另一个选项,以确保适当地存储回调中的所有data个对象。

var args = [];
function AsyncFunc(args){
    $.get(args.url, function(data){
        args.push(data);
    });
}
//now args will have 10 uniquely different data objects stored inside.