问题描述
我正在将字符串消息从background.js发送到popup.js。 我的确在popup.js中收到一条消息,但无法操作。 我可以查看它是否具有alert()或将其分配给popup.html元素的innerHTML,但无法将其分配给popup.js中的任何变量,因此可以对其进行修改并加以利用。
我尝试了常规分配,尝试使用substring()将消息复制到另一个变量中
在这里,我有一块background.js发送消息到popup.js。 myString是一个字符串:
chrome.runtime.sendMessage({
action: "getSource",
source: myString
});
这是一段popup.js,一旦执行background.js,它就会收到消息,下面的代码起作用,它在popup.html中显示字符串:
chrome.runtime.onMessage.addListener(function(request, sender) {
if (request.action == "getSource") {
container.innerHTML = request.source;}})
这也适用:
chrome.runtime.onMessage.addListener(function(request, sender) {
if (request.action == "getSource") {
alert(request.source);}})
但是,当我尝试将其分配给变量时,我什么也没得到(testString仍然为空):
var testString = '';
chrome.runtime.onMessage.addListener(function(request, sender) {
if (request.action == "getSource") {
testString = request.source;}})
如果我为chrome.runtime.onMessage.addListener(...)之外的testString分配值,则分配工作正常,testString最终为“ abcde”:
var testString = '';
chrome.runtime.onMessage.addListener(function(request, sender) {
if (request.action == "getSource") {
console.log("do nothing")}});
testString = "abcde";
我想将request.source的内容包含在变量中,以便可以对其进行操作。
谢谢。
1楼
chrome.runtime.onMessage.addListener
接收回调作为参数,并且其返回值不是同步的。
当您从后台收到消息时,变量testString
可能已经分配给"abcde"
或您尝试在addListener函数之后为其分配的任何其他值。
您必须调用另一个函数(在addListener回调内部),该函数将testString
作为参数传递:
var testString = '';
function onMessageReceived (source) {
testString = source
// do whatever you want with the value
}
chrome.runtime.onMessage.addListener(function (request, sender) {
if (request.action === 'getSource') {
onMessageReceived(request.source)
}
})
另一种选择是将整个chrome.runtime.onMessage.addListener
包装在Promise中:
function onMessageReceived (source) {
return new Promise(function (resolve, reject) {
chrome.runtime.onMessage.addListener(function (request, sender) {
if (request.action === 'getSource') {
resolve(request.source)
}
// don't forget to reject the Promise if some condition is not satisfied
})
}
onMessageReceive().then(function (source) {
// variable source contains request.source value
})