2012-09-12 24 views
0

在我的chrome扩展中,我正在检查一个函数,该函数可以阻止我的for循环处理,直到它从内容脚本获得响应。下面分享Javascript等待请求在for循环中处理

function abc() { 
    chrome.tabs.query({'status': 'complete'}, function(tabArray) { 
    for (var i = 0, tab; tab = tabArray[i]; i++) { 
     var currentUrl = tab.url; 
     var tabId = tab.id; 
     if (currentUrl.match(otherthing)) { 
     chrome.tabs.sendRequest(tabId, {'type': 'getrequiredthing'}, 
      function(response) { 
       if (response.isrequiredthind) { 
       callfunction(tabId); 
       } 
      } 
     ); 
     } 
    } 
    }); 
} 

下面的示例代码中,当我在else if获取匹配的URL我送页面的请求得到了一些信息,如果我的信息是积极的,我需要callfunction。但是在for循环中,tabId迭代速度非常快,即使响应是积极的,它也会使用next(或next)tabId调用callfunction。

你能否提出你的意见,解决这个问题,等待for循环收到这个响应。

谢谢

+0

如果您在继续之前需要每个请求的响应,请尝试链接回调代替使用for循环。 –

回答

0

问题是sendRequest的第三个参数不会阻止请求准备就绪。按照设计,JavaScript几乎不会阻塞。这是一件好事。相反,它使用“事件驱动”模型。

另一个问题是由于词法作用域:当调用callfunction时,tabId具有最近的值,而不是调用sendRequest时的值。为了解决这个问题,你需要为每个循环迭代创建一个单独的范围,例如

for (...) { 
    var tabId = ...; 
    if (...) { 
    (function (localTabId) { 
     chrome.tabs.SendRequest(..., function (response) { 
     if (response.isrequiredthind) { 
      callfunction(localTabId); 
     } 
     } 
    })(tabId); 
    } 
} 
+0

非常感谢。 :) – RaviTeja