谷歌插件 The message port closed before a response was received

"manifest_version": 2

content与background消息通信

content向background发送消息后的异步消息返回

/发送消息
chrome.runtime.sendMessage({
        info: "我是 content.js, 我在发送消息"
    }, res => {
        console.log('我是 content.js ,我收到消息:', res)
  })

// 接收消息
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
    console.log(request, sender, sendResponse)
    sendResponse('我收到了你的消息!');
});

background.js页面接收和发送消息

//background.js
//接收消息
chrome.runtime.onMessage.addListener(async (req, sender, sendResponse) => {
    console.log('我是background,我接收了来自 content.js的消息:', req.info)
    sendResponse('哈哈哈')
    const tabId = await getCurrentTabId()
    // 在背景页面发送消息,需要当前 tabID
    chrome.tabs.sendMessage(tabId, '我是background,我在发送消息', function (res) {
        console.log('background:', res)
    });
})
/**
 * 获取当前 tab ID
 */
function getCurrentTabId() {
    return new Promise((resolve, reject) => {
        chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
            resolve(tabs.length ? tabs[0].id : null)
        });
    })
}

"manifest_version": 3

content与background消息通信

content向background发送消息后的异步消息返回

// content.js
// content给后台发送消息
function sendMessageToBackground(msg, callback) {
  chrome.runtime.sendMessage(msg, (response) => {
    if(callback) {
      callback(response)
    } 
  })
}

// content发送消息并等待消息返回
sendMessageToBackground({type: 'xxx'}, (response) => {
	console.log(response)
})

background接收到消息后的异步返回处理

// background.js
// background 接收到消息后处理
function getMessage(handler) {
  if(handler) {
    chrome.runtime.onMessage.addListener((request, render, sendResponse) => {
      handler(request, render, sendResponse)
      return true // 重点是这一个 返回true:允许返回异步消息
    })
  }
}

// background 接收到消息后的处理
getMessage((request, render, sendResponse) => {
  // 假设去掉return ture后,放开下面代码,是会返回ok还是result?
  // sendResponse('ok')
  if(request.type === 'xxx') {
    // 一些异步消息的处理
    // 假设在handler回调之后没有做 return ture; 处理?而且该代码块是一段时间较长异步操作,sendResponse()返回将会报错,不能正确返回到调用处
    sendResponse('reslut')  // 因为return true;这里可以异步处理消息后返回
  }
})

总结:虽然在"manifest_version": 3版本中可以使用 版本2的消息通信,,但是会报错The message port closed before a response was received

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值