首页 > 一个异步函数如何调用 n 次

一个异步函数如何调用 n 次

现在我有一个用来在线投票的 vote 函数,它的用法大概是这样的:

jsvote(url, function(body){
    console.log(body);
})

现在我想对同一个 url 投 10 次票,于是我就想着这样写:

jsfor (var i=0; i < 10; i++) {
  vote(url, function(body){
    console.log(body);
  });
}

但是失败了,因为它是异步执行的吧,把 i 输出来就知道了,

jsfor (var i=0; i < 10; i++) {
  vote(url, function(body){
    console.log(i);
    console.log(body);
  });
}

所以要如何才能正确的调用这个函数 10 次呢?尝试了很多搜索比如node call a asynchronous function n times 还是没有找到想要的结果,用 forEach 之类的也不行。


补充:这个确实执行了 10 次,好像问题不出在这里,应该是投票请求太频繁了被限制了,我再去调查一下,谢谢各位。


你最初的做法并没有什么错,因为for loop在这里对你来说仅仅做了一个计数器,能不能谈谈你说失败了是什么意思,怎么失败了?

第二种方法之所以不行,是因为一个异步函数在for loop里执行,如果引用了i变量,因为异步函数在执行栈中的序列问题,i变量永远只拿到了最后一次的结果。这也没有错。


JavaScript 用户要好好学习呀。

首先呢,你没有明确地要求是一个接一个地投票,还是并发投票。并发投票的话,你的代码应该能够正常工作,不知道你为何认为它失败了。你的代码应当会输出 body 10 次,也会输出 10 次 i 的值——它们大概会都是 10。如果你想要输出 0 1 2 3 4 5 6 7 8 9,请在本站搜索「JavaScript 闭包」(鉴于本站的搜索功能比较弱,你最好还是用 Google 搜索,使用「site:.com」限定一下就可以了)。

其次呢,如果你想一个接一个地投票,需要一点技巧(将次数信息通过参数传递)。如果你学习过函数式编程应该很容易想到。鉴于你没有明确地要求,我就不费时写示例代码了。

最后呢,提问时建议尽量使用别人能够运行并复现问题的例子,这样子对双方都比较省力。


我想说你的写法已经调用那个函数10次了!只是你在那里输出i是不能证明你调用了该函数多少次的。

        var url = "xxx";
        function vote(url,callback,i){
            console.log(i);
        }
        for(var i=0;i<10;i++){
            vote(url, function(body){
                console.log(body);
            },i)
        }

这里在打印的时候 就会打印10次的,不就是你想要的调用10次函数么。


如果你想获得正确的i,可以这样

for (var i=0; i < 10; i++) {
    (function(i){
        vote(url, function(body){
            console.log(i);
            console.log(body);
          });
    })(i);
}

但是这看起来不像i的问题,vote又不用i做参数。

【热门文章】
【热门文章】