如何使用 addListener 发送变量?

How to send a variable with a addListener?

我的弹出脚本试图从内容脚本中获取变量:

browser.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        //console.log("TryToCall");
        searchTerm = browser.tabs.sendMessage(tabs[0].id, { type: "getDoi" });
        console.log("received message: " + searchTerm);
        setButtons(searchTerm);
    });

内容脚本侦听:

function listener(message, sender, response) {
    //console.log("called");
    switch (message.type) {
        case "getDoi":
            console.log("I heard you. I send " + searchTerm)
            return searchTerm ;
        default:
            //console.error("Unrecognised message: " + message);
            return "X";
    }
}

问题是:我的弹出窗口得到的不是字符串 searchTerm(它在别处定义并在监听器中正确设置,因为控制台正确打印出来) =]

这可能超级简单,但我不知道如何让弹出窗口接收字符串或将 promise 转换为字符串。

提前致谢!

你可以在你得到承诺值的地方做这个。

then 是一个在 promise 被解决后启动的对象。 同样,如果承诺被拒绝,您可以使用 .catch(res=>{}) 来获得某种异常。

在这种情况下,它将是

 searchTerm.then((res)=>{
      return res;
 })
.then((res) => {
      console.log(res); //here is not a promise anymore, It will probably be an object that you can access
})

然后你将在下一个然后有你的变量。 此外,这可能 return 你一个 json 对象,但如果你想把它作为文本,你可以

searchTerm.then((res)=>{
      return res.path_to_string.text(); //Access the path of the res that contains the string you need and then convert it 
 })
.then((res) => {
      console.log(res); //You will have a string containing the whole object.
})

我建议您在 Javascript Promise

上记录更多

我设法暂时解决了问题:

我用 sendResponse 替换了承诺。 sendResponse 发回的任何内容都可以通过 sendResponse.value:

读取
function listener(message, sender, sendResponse) {
        switch (message.type) {
            case "getDoi":
                sendResponse ({ value: searchTerm });
            default:
                //console.error("Unrecognised message: " + message);
                sendResponse({value: "Error"});
        }    
}

拾取者:

function handleResponse(message) {
    console.log("Message: " + message.value);
    setButtons(message.value);
}
function handleError(error) {
    console.log("Error: " + error.value);
}

    browser.tabs.query({ active: true, currentWindow: true }, function (tabs) {
        browser.tabs.sendMessage(tabs[0].id, { type: "getDoi" }).then(handleResponse,handleError);
    })

显然 sendResponse 将被淘汰 (?https://github.com/mozilla/webextension-polyfill/issues/16#issuecomment-296693219),我将不得不在某个时候修复它,但现在它可以工作。