javascript - 如何编写一个 JS 回调函数来记住变化变量的旧值?

标签 javascript asynchronous closures

这是我的 JS 程序的简化。 mylist 是一个字符串数组,MyAsync 是一个函数,它接受一个对象并安排稍后调用所提供的回调。

for (var myindex = 0; myindex < mylist.length; myindex += 1) {      
    MyAsync(mylist[myindex], function () { alert(myindex); });
}

mylist中有十个项目时,结果是两条警报消息,每条都显示“10”。好的,很明显,循环结束后使用的是 myindex 的值。所以我做了一些小小的改变......

for (var myindex = 0; myindex < mylist.length; myindex += 1) {
    var copyindex = myindex;
    MyAsync(mylist[myindex], function () { alert(copyindex); });
}

现在,每个警报都显示“9”。

我如何安排回调函数来了解调用 MyAsyncmyindex 是什么?

异步,bilpg。

最佳答案

是的,正如评论和not making functions in a loop因为您正在经历的原因。

我们可以使用递归函数来代替:

 var len = mylist.length;

 function asyncLoop(index) {
    MyAsync(mylist[index], function () { 
    if(index < len) {
        asyncLoop(++index);
     }
    });
  } 
  asyncLoop(0);
<小时/>

作为注释,- 同时将它们全部关闭*(*- 像循环一样快运行)。并跟踪数组计数 ...

 function asyncDo(index) {
    MyAsync(mylist[index], function () { 
      /* we have access to the array index here */
      console.log(index);
    });
  } 

  for ( var i=0, len=mylist.length; i<len; ++i) { asyncDo(i); }

关于javascript - 如何编写一个 JS 回调函数来记住变化变量的旧值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845270/

相关文章:

c# - 如果实例已被处置,则在不调用 EndXXX 的情况下调用 BeginXXX 是否安全

multithreading - 无法在生成的线程中调用函数,因为它是 "does not fulfill the required lifetime"

c# - 使用 Func 捕获类属性

javascript - 在 jquery 中调用同名函数?

node.js - 作为事件驱动的服务器,为什么 node.js 需要异步代码而 Nginx 不需要?

c++ - 从 C++ Windows 应用商店应用程序使用 sqlite-winrt

Swift闭包异步执行顺序

javascript - "Uncaught TypeError: Object #<Object> has no method ' 使用AJAX后可拖动' "

javascript - Bootstrap popover 仅适用于悬停

javascript - html bootstrap下拉列表获取所选项目的索引