我正在编写一个与gmail交互的chrome扩展(我的版本是chrome 45 ),并且我在将消息从background.js发送到我的内容脚本时遇到了问题。异步方面是问题所在。我怎样才能在回电话后得到要发送的消息?
//---------in content script---------
chrome.runtime.sendMessage({ messageId: _id }, function (response) {
console.log('the respose.messagePayload is: ' + response.messagePayload);
});
//---------in background script---------
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
getMessage('me', request.messageId, function (payload) {
//i want to send my response here
//this executes and grabs the payload of data from the api, but isn't sending back the message to the content-script
sendResponse({ messagePayload: payload });
});
//this synchronous call sends a message to the content-script
//sendResponse({ messagePayload: "payload" });
return true;
});
function getMessage(userId, messageId,callback) {
var request = gapi.client.gmail.users.messages.get({
'userId': userId,
'id': messageId
});
request.execute(callback);
}发布于 2016-02-07 08:54:47
您应该在回调中发送sendResponse函数。
getMessage('me', request.messageId, sendResponse);然后,当您的getMessage调用完成时执行此命令。
function getMessage(userId, messageId, sendResponse) {
var request = gapi.client.gmail.users.messages.get({
'userId': userId,
'id': messageId
});
request.execute(function(response) {
sendResponse({messagePayload: response.payload});
});
}另一种可能的解决方案:
tab id对象获取sender。getMessage函数即可。getMessage函数中的回调函数将向内容脚本发回有效负载。onMessage侦听器,该监听器将接收有效负载,然后对有效负载执行您想做的事情。您的代码应该是:
//---------in background script---------
chrome.runtime.onMessage.addListener(function (request, sender,sendResponse) {
getMessage('me', request.messageId, sender.tab.id);
});
function getMessage(userId, messageId, tabId) {
var request = gapi.client.gmail.users.messages.get({
'userId': userId,
'id': messageId
});
request.execute(function(response) {
// Whatever response you want to sent
// Below URL explains your response object
// https://developers.google.com/gmail/api/v1/reference/users/messages#resource
// Assuming you want to send payload
chrome.tabs.sendMessage(tab.id, {messagePayload: response.payload});
});
}
//---------in content script---------
chrome.runtime.sendMessage({ messageId: _id });
chrome.runtime.onMessage.addListener(function (request, sender,sendResponse) {
// Just to verify that the request is from the getMessage callback
// Because this will listen to all request from your extension
if (request.messagePayload) {
console.log('the respose.messagePayload is: ' + request.messagePayload);
}
});我希望这能帮到你。
https://stackoverflow.com/questions/35237621
复制相似问题