2

После this question, связь между нагнетаемым сценарием и сценарием контента может быть сделаны таким образом:Сообщений от введенного сценария к сценарию контента с ответом

// Content script 
window.addEventListener("getChromeData", function(data) { 
    // do Chrome things; 
}, false); 

// Injected script 
window.dispatchEvent(new CustomEvent("getChromeData", {data: 'whatever'})); 

Я хотел бы знать, если есть способ сделать использование возвращенных данных в инъецируемый скрипт с использованием обещания или механизма обратного вызова?

ответ

4

Обратный звонок снова завершен случаем. Вы можете использовать прослушиватель с одним выстрелом для достижения ответа на основе обещаний.

Я передам дополнительный запрос ID, чтобы слушатели с одним выстрелом случайно не запутались; возможно, это перебор.

Содержание сценария:

window.addEventListener("getChromeData", function(evt) { 
    var request = evt.detail; 
    var response = {requestId: request.id}; 
    // do Chrome things with request.data, add stuff to response.data 
    window.dispatchEvent(new CustomEvent("sendChromeData", {detail: response})); 
}, false); 

Введенный сценарий:

var ChromeRequest = (function(){ 
    var requestId = 0; 

    function getData(data) { 
    var id = requestId++; 

    return new Promise(function(resolve, reject) { 
     var listener = function(evt) { 
     if(evt.detail.requestId == id) { 
      // Deregister self 
      window.removeEventListener("sendChromeData", listener); 
      resolve(evt.detail.data); 
     } 
     } 

     window.addEventListener("sendChromeData", listener); 

     var payload = { data: data, id: id }; 

     window.dispatchEvent(new CustomEvent("getChromeData", {detail: payload})); 
    });   
    } 

    return { getData: getData }; 
})(); 

ChromeRequest.getData("whatever").then(function(data){/* ... */}); 

Пожалуйста, обратите внимание, что вы должны использовать detail атрибут CustomEvent, это не произвольное свойство.

+0

О, так сделано так! Еще раз спасибо, ты мужчина! –