如何使用 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),我将不得不在某个时候修复它,但现在它可以工作。
我的弹出脚本试图从内容脚本中获取变量:
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),我将不得不在某个时候修复它,但现在它可以工作。