2015-05-08 2 views
0

Я пытаюсь сделать обходной путь для асинхронного характера функции расширения Chrome, объявив и прослушивая пользовательские события расширения Chrome. До сих пор я не нашел подходящего решения.Объявление и прослушивание пользовательского события Chrome Ext

Таким образом, это структура моего background.js"persistent": false набором в manifest.json):

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.query({active: true, currentWindow: true}, 
     function(tabs) { 
      //Action 1: chrome.tabs.sendMessage(tabs[0].id, ... 
      //Action 2: chrome.tabs.sendMessage(tabs[0].id, ... 
      //Action 3: chrome.tabs.create({url: someUrl, ... 
     } 
    ) 
}); 

Действие 3 должен выполняться только после действий 1 и 2 были завершены. Я думаю, что по завершении своих действий действия 1 и 2 отправляют событие, например Action1CompleteEvent и Action2CompleteEvent, и действие 3 прослушивает это событие. Как только оба обнаружены, он выполнит свое действие.

Возможно ли это? Каковы некоторые способы достижения того же эффекта, который люди использовали?

Спасибо за ваше время.

ответ

1

Невозможно «вокруг» асинхронности.

Каждая функция API асинхронизации Chrome принимает параметр обратного вызова. Обратный вызов гарантированно вызывается после операции.

Итак, вам нужно приковать код:

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.query({active: true, currentWindow: true}, 
     function(tabs) { 
      chrome.tabs.sendMessage(/*...*/, function() { 
       chrome.tabs.sendMessage(/*...*/, function() { 
       chrome.tabs.create(/*...*/); 
       }); 
      }); 
     } 
    ) 
}); 

Если вы хотите, вы можете попробовать и использовать Promises, хотя API Chrome изначально не работать с ними - вам нужно обернуть его некоторые вспомогательные функции. Это может сделать ваш код более управляемым.

Смежные вопросы