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才能异步。所以也得谨慎。