Вернуть карту из фонового скрипта, используя Promise - PullRequest
0 голосов
/ 09 января 2019

Я пишу веб-расширение и мне нужно получить карту в ответ на фоновый скрипт. Чтобы сделать мое расширение совместимым как с Firefox, так и с Chrome, я использую webextension-polyfill от Mozilla . Вот пример кода:

front.js:

var sendmsg = browser.runtime.sendMessage(1);

sendmsg.then(
    result => { handleResponse(result); },
    error => { handleError(error); });

function handleError(e)
{
   console.log("ERROR HANDLED: " + e);
}

function handleResponse(result)
{
    console.log("map size = " + result.size);  
}

background.js

var maptest = new Map();

browser.runtime.onMessage.addListener(onContentMessage);

function onContentMessage(msg, sender, handleResponse)
{
  return new Promise(resolve => {
    maptest.clear();
    maptest.set("aaa", 1);
    resolve(maptest);
  });
}

Однако это работает только в ff, в любом браузере на основе хрома аргумент handleResponse имеет значение undefined . Я проверил Promises под Chrome без обмена сообщениями с контентом в фоновом режиме, и он правильно отображает карту. Проблема в webextension-polyfill и кто-нибудь знает, как ее решить?

1 Ответ

0 голосов
/ 09 января 2019

Решение заключается в следующем: в фоновом скрипте необходимо применить оператор распространения к объекту карты

push([...maptest]);

Преобразует объект карты в массив [[key1, value1], [key2, value2], ...]. Этот массив может быть получен в скрипте содержимого и может быть преобразован обратно в объект карты с помощью:

function handleResponse(result)
{
  var mapobj = new Map(result);

Спасибо wOxxOm за решение

...