如何使用addListener发送变量?

时间:2019-06-08 08:40:15

标签: javascript firefox-addon firefox-webextensions

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

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。而不是字符串[object Promise](它是在其他位置定义的,并且在控制台正确打印时已在侦听器中正确设置)。

这可能非常简单,但是我无法弄清楚如何使弹出窗口接收字符串或将promise转换为字符串。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在获得承诺值的地方进行设置。

then是在解决承诺后启动的对象。 同样,如果承诺被拒绝,您可以使用.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
})

,然后在下一个变量中。 此外,这可能会返回一个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

答案 1 :(得分:0)

我设法暂时解决了这个问题:

我用sendResponse代替了诺言。 然后,可以通过sendResponse.value读取sendResponse发送回的内容:

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),我将不得不在某个时间点修复它,但目前仍然有效。