Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在循环中执行异步操作_Javascript_Loops_Asynchronous_Closures - Fatal编程技术网

Javascript 如何在循环中执行异步操作

Javascript 如何在循环中执行异步操作,javascript,loops,asynchronous,closures,Javascript,Loops,Asynchronous,Closures,我正在工作,根据我的用例,我必须在循环中从localStorage中删除一些对象。这是我的密码 for (var i = 0; i < objectKeys.length; i++) { chrome.storage.local.remove(objectKeys[i], function() { // Do something with objectKeys[i] like remove the corresponding element from DOM // Sh

我正在工作,根据我的用例,我必须在循环中从localStorage中删除一些对象。这是我的密码

for (var i = 0; i < objectKeys.length; i++) {
  chrome.storage.local.remove(objectKeys[i], function() {
    // Do something with objectKeys[i] like remove the corresponding element from DOM
    // Show notification to user that objectKeys[i] item has been removed
  });
}
for(var i=0;i
您可以看到,我在这里使用了
Closure
,以确定删除了哪个特定对象,并在以后对其进行处理。但问题是

在调用匿名方法(remove success handler)之前,循环中的i值可能已更改,它可能会影响处理程序中的操作


我如何解决这个问题

尝试在闭包范围内使用变量,稍后再访问

for (var i = 0; i < objectKeys.length; i++) {
  var myobject = objectKeys[i]; //this variable is in the scope of the closure
  chrome.storage.local.remove(myobject, function() {
    // Do something with objectKeys[i] like remove the corresponding element from DOM
    // Show notification to user that objectKeys[i] item has been removed
  });
}
for(var i=0;i
对于
循环,我们可以使用递归函数而不是

var len = objectKeys.length;

function asyncLoop(count) {
  chrome.storage.local.remove(objectKeys[count], function() {
    if(count < len) { 
      asyncLoop(count++); 
    }
  });
}

asyncLoop(0);
var len=objectKeys.length;
函数异步循环(计数){
chrome.storage.local.remove(objectkey[count],function()){
如果(计数
+1确实是个好主意!!我也这么认为,但这种方法的问题是,我们已经链接了所有异步调用,如果其中一个失败,Rest将不执行。这很好。我对上述方法很满意。只要允许,我将尽快接受答案:)我已编辑代码,使其更简单。你能核实一下吗。如果我犯了任何错误,请随时恢复修订。感谢可能是最常见的10个问题之一的重复。@Felix感谢您发布了一个非常有见解的答案的链接。.顺便说一句,我做了谷歌搜索,但与ajax和循环术语相关。。再次感谢….是时候拿起好的零件手册,阅读有关闭包的内容了….:)这并不能解决问题。同样,
myobject
将在执行第一次回调时具有上一次迭代的值。