我的弹出脚本试图从内容脚本获取变量:
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转换为字符串。
谢谢!
答案 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),我将不得不在某个时间点修复它,但目前仍然有效。