chrome.runtime.sendMessage 回调函数参数为undefined

chrome.runtime.sendMessage的回调函数默认是同步的,而且超时后直接执行,返回undefined,如果要异步执行,必须在处理函数中return true

最近在学习chrome插件,在content scripts 和background的消息传递方面栽了个大坑,一开始仿照demo测试:

//content.js
chrome.runtime.sendMessage({greet:'hello'},function (response) {
    console.log('content get response:',response);
});
//background.js
chrome.runtime.onMessage.addListener(function (request,sender,callback) {
    callback('hi!');
});

这里写图片描述

然后就天真的以为回调函数是异步的,直到今天开发某个小功能时,里面有网络请求,content scripts得到的参数始终为undefined,各种断点,测试到快怀疑人生了,然后去google上搜索了下,最后在官方文档上发现了这么句话:
这里写图片描述

意思是,sendResponse这个回调方法,只在同步使用时正常执行,如果要异步使用,必须在处理函数中return true。

上面的例子异步执行应该这么改:

//background.js
chrome.runtime.onMessage.addListener(function (request,sender,callback) {
    setTimeout(function(){
        callback('hi!');
    },2000);
    return true;//这是重点,没有return true,上面返回的是undefined而不是"hi!"
});

坑爹了,国内翻译的文档上压根就没这句话,这个坑测试了一天,看来以后有问题要第一时间翻官方文档。

大部分情况下,看这个文档也是可以的:https://crxdoc-zh.appspot.com/extensions/messaging。但这里面就没提到sendResponse必须return true才能异步。所以也得谨慎。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值