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

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

jsvoteurl, functionbody{ console.logbody;
}

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

jsfor var i=0; i < 10; i++ { voteurl, functionbody{ console.logbody; };
}

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

jsfor var i=0; i < 10; i++ { voteurl, functionbody{ console.logi; console.logbody; };
}

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


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

JavaScript 用户要好好学习呀。

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

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

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

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

for var i=0; i < 10; i++ { functioni{ voteurl, functionbody{ console.logi; console.logbody; }; }i;
}

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

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

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

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

 var url = "xxx"; function voteurl,callback,i{ console.logi; } forvar i=0;i<10;i++{ voteurl, functionbody{ console.logbody; },i }

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注