0

在我的 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 时,else if我正在向页面发送获取一些信息的请求,如果我的信息是肯定的,我需要调用函数。但是在 for 循环中,tabId 的迭代速度非常快,即使响应是肯定的,它也会使用 next(或 next)tabId 调用 callfunction。

您能否就解决此问题发表意见,请继续等待收到此响应的 for 循环。

谢谢

4

1 回答 1

0

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

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

for (...) {
  var tabId = ...;
  if (...) {
    (function (localTabId) {
      chrome.tabs.SendRequest(..., function (response) {
        if (response.isrequiredthind) {
          callfunction(localTabId);
        }
      }
    })(tabId);
  }
}
于 2012-09-12T20:48:44.453 回答