在循环中调用异步函数时避免重复创建函数

时间:2014-03-21 19:06:39

标签: javascript asynchronous

有没有办法在不创建10次匿名函数的情况下执行以下操作? 假设setTimeout只接受2个参数,回调和间隔。从我所听到的,你不应该在循环中创建函数,因为它很慢。但是,如果异步函数不允许您传递希望回调知道的参数,是否可以避免这样做?注意:我知道在Chrome中,setTimeout需要更多的参数,所以这不是一个理想的例子。

function doSomethingAsync(i){
    setTimeout(function() { //This anonymous function is created 10 times
        console.log(i);
    }, 1000);
}

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

3 个答案:

答案 0 :(得分:2)

简短回答 - 。如果您想要将每个迭代的值匹配回来,就像您在这里所做的那样。我不打算对此处的表现发表评论,而是首先关注需求。

如果您不关心映射到右侧调用的值,那么您可以简单地避免创建函数

javascript引擎允许这样的情况。这适用于不必定义多个匿名函数。这是通过向回调提供关于当前执行的更多信息来实现的,即eventobject。这就是DOM,XHR,HTML5文件API等的交互方式。所以这理想地意味着Javascript上下文之外的东西正在调用带有所需信息的Javascript方法。

浏览器或者说JS引擎应该提供一种机制来预先定义一些排序eventobject用于回调策略,因此一个function可以处理所有callbacks。 AFAIK,除了创建小函数闭包之外,目前在JS本身没有相同的方法。所以我们要等到有消息传出来。

希望这有助于阐明它。

更新 - 刚看到问题的注释,删除了不必要的代码。

答案 1 :(得分:1)

为了得到你想要的相同结果,我会去递归:

var i = 0; 
doSomethingAsync();
function doSomethingAsync()
{
i = i +1; 
console.log(i);
if (i<10) setTimeout(doSomethingAsync,500);
}

答案 2 :(得分:1)

这个具体示例有一种方法,使用eval()。我不打算辩论你是否应该使用它,但是......

您可以像这样重写您的示例:

function doSomethingAsync(i){
    setTimeout("console.log(" + i + ");", 1000);
}

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

将字符串传递给setTimeout会在经过一段时间后传入的字符串上执行等效的eval()