猿问

循环内的异步进程

循环内的异步进程

我正在运行以下形式的事件循环:

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

    asynchronousProcess(callbackFunction() {
        alert(i);
    });}

我正在尝试显示一系列显示数字0到10的警报。问题在于,当回调函数被触发时,循环已经进行了几次迭代,并且它显示了更高的i。关于如何解决这个问题有什么建议吗?


慕森卡
浏览 521回答 3
3回答

慕标5832272

几个。你可以用绑定:for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;j;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;asycronouseProcess(function&nbsp;(i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i); &nbsp;&nbsp;&nbsp;&nbsp;}.bind(null,&nbsp;i));}或者,如果您的浏览器支持放任(它将出现在下一个ECMAScript版本中,但是Firefox已经支持它一段时间了),您可以拥有:for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;j;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;k&nbsp;=&nbsp;i; &nbsp;&nbsp;&nbsp;&nbsp;asycronouseProcess(function()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(k); &nbsp;&nbsp;&nbsp;&nbsp;});}或者,你可以做bind手动(如果浏览器不支持它,但我想说在这种情况下可以实现SIM,它应该在上面的链接中):for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;j;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;asycronouseProcess(function(i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;function&nbsp;()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(i) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}(i));}我通常更喜欢let当我可以使用它时(例如火狐插件),则为bind或者一种习俗竞逐函数(不需要上下文对象)。
随时随地看视频慕课网APP
我要回答