当前位置: 代码迷 >> JavaScript >> 我收到了从一个扩展脚本到另一个扩展脚本的消息,可以对消息进行alert(),但是不能将其分配给任何变量
  详细解决方案

我收到了从一个扩展脚本到另一个扩展脚本的消息,可以对消息进行alert(),但是不能将其分配给任何变量

热度:96   发布时间:2023-06-13 12:16:51.0

我正在将字符串消息从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的内容包含在变量中,以便可以对其进行操作。

谢谢。

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
})
  相关解决方案