9

非同期メソッドを待つのはばかげていることはわかっています。代わりにコールバックを使用する必要があります。しかし、サード パーティの API によって同期が強制された場合はどうなるでしょうか。

ユーザーが別のタブで既に開いている Web サイトにアクセスできないようにする Chrome 拡張機能を開発しています。基本的に、開いているタブの URL に基づいてリクエストをキャンセルする必要があります。私はこのように使いたいchrome.webRequest.onBeforeRequest

function onBeforeRequest(details) {
  var websiteAlreadyOpenInOtherTab;

  // Here i want to set `websiteAlreadyOpenInOtherTab` by using the `chrome.tabs`
  // API. It's asynchronous though and that's my problem. I cant return a value
  // from an asynchronous method call.

  if (websiteAlreadyOpenInOtherTab) {
    return { cancel: true };
  }
}

chrome.webRequest.onBeforeRequest.addListener(
  onBeforeRequest,
  { urls: ['<all_urls>'], types: ['main_frame'] },
  ['blocking']);

上記のコードで私のジレンマを理解していただければ幸いです。非同期メソッド呼び出しの結果に基づいてオブジェクトを返す必要があります。これを達成することは可能ですか?

4

1 に答える 1

6

タブの URL を追跡することで問題を解決できるでしょうか? :

  1. アプリの起動時に、開いているすべてのタブの URL を取得します。chrome.tabs.query
  2. URLを購読しchrome.tabs.onUpdatedchrome.tabs.onRemoved変更時に URL を追加/削除/更新します。

ドキュメントに基づくある種のコード例:

var tabUrlHandler = (function() {
   // All opened urls
   var urls = {},

   queryTabsCallback = function(allTabs) {
      allTabs && allTabs.forEach(function(tab) {
          urls[tab.id] = tab.url;
      });
   },

   updateTabCallback = function(tabId, changeinfo, tab) {
       urls[tabId] = tab.url;
   },

   removeTabCallback = function(tabId, removeinfo) {
       delete urls[tabId]; 
   };

   // init
   chrome.tabs.query({ active: true }, queryTabsCallback);
   chrome.tabs.onUpdated.addListener(updateTabCallback);
   chrome.tabs.onRemoved.addListener(removeTabCallback);

   return {
     contains: function(url) {
        for (var urlId in urls) {
           if (urls[urlId] == url) {
              return true;
           }
        }

        return false;
     }
   };

}());

tabUrlHandlerこれで、次のように直接尋ねることができるはずですonBeforeRequestMethod

function onBeforeRequest(details) {
  var websiteAlreadyOpenInOtherTab = tabUrlHandler.contains(details.url);

  if (websiteAlreadyOpenInOtherTab) {
    return { cancel: true };
  }
}
于 2013-02-28T07:51:09.060 に答える