0

私のクロム拡張機能では、コンテンツ スクリプトからの応答を取得するまで 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 の 3 番目の引数が、要求の準備ができているときにブロックされないことです。設計上、JavaScript はほとんどブロックしません。これは良いことです。代わりに、「イベント駆動型」モデルを使用します。

もう 1 つの問題は、レキシカル スコープによるものです。callfunction が呼び出されると、sendRequest が呼び出されたときの値ではなく、tabId が最新の値になります。これを回避するには、ループの繰り返しごとに別のスコープを作成する必要があります。

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