Google chrome extension Javascript在for循环中等待处理请求

Google chrome extension Javascript在for循环中等待处理请求,google-chrome-extension,javascript,Google Chrome Extension,Javascript,在我的chrome扩展中,我正在检查一个函数,该函数可以停止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.i

在我的chrome扩展中,我正在检查一个函数,该函数可以停止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);
              }
            }
        ); 
      }
    }
  });
}
在这里,当我在
中获得匹配的url时,如果
我正在向页面发送获取某些信息的请求,如果我的信息是肯定的,我需要调用函数。但是这里for循环中的tabId迭代速度非常快,即使响应是肯定的,它也使用next(或next)tabId调用callfunction

你能给出你对解决这个问题的意见吗?继续等待收到这个回复


谢谢

问题在于sendRequest的第三个参数在请求准备就绪时没有阻塞。根据设计,JavaScript几乎从不阻塞。这是一件好事。相反,它使用“事件驱动”模型

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

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

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