首页 > 解决方案 > 使用 Promise 从后台脚本返回地图

问题描述

我正在编写网络扩展,我需要从后台脚本中获取地图作为回复。为了使我的扩展与 firefox 和 chrome 兼容,我使用了 Mozilla 的webextension-polyfill。这是一个代码示例:

前端.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);  
}

背景.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,在任何基于 chromium 的浏览器中,handleResponse 参数是undefined。我已经在没有内容背景消息交换的情况下在 chrome 下测试了 Promises,它正确返回了 map。是 webextension-polyfill 中的问题吗?有人知道如何解决吗?

标签: javascriptgoogle-chrome-extensionfirefox-addon-webextensions

解决方案


解决方案如下:在后台脚本中,必须将扩展运算符应用于映射对象

push([...maptest]);

它将映射对象转换为 [[key1, value1], [key2, value2], ... ] 数组。该数组可以在内容脚本中接收,并且可以通过以下方式转换回地图对象:

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

感谢wOxxOm的解决方案


推荐阅读