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

Javascript wait for request to process in a for loop

本文关键字:等待 处理 请求 循环 for Javascript      更新时间:2023-09-26

在我的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);
              }
            }
        ); 
      }
    }
  });
}

在这里,当我在else if中获得匹配的url时,我会向页面发送一个获取一些信息的请求,如果我的信息是肯定的,我需要调用函数。但在for循环中,tabId迭代得非常快,即使响应是肯定的,它也会使用next(或next)tabId调用调用函数。

你能给出你对解决这个问题的意见吗?请等待这个回复。

感谢

问题是sendRequest的第三个参数在请求准备好时没有阻止。从设计上讲,JavaScript几乎从不阻塞。这是一件好事。相反,它使用了一个"事件驱动"的模型。

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

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