Javascript 如何在循环中执行异步操作
我正在工作,根据我的用例,我必须在循环中从localStorage中删除一些对象。这是我的密码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
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
将在执行第一次回调时具有上一次迭代的值。