未发送 Chrome 扩展程序发送响应回调值
Chrome Extension sendResponse callback value not being sent
我正在编写一个与gmail api交互的chrome扩展程序(chrome 45是我的版本),但我在从后台向我的内容脚本发送消息时遇到问题.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);
}
Chrome 扩展程序消息传递:未发送响应
您应该在回调中发送 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});
});
}
另一种可能的解决方案:
- 从
sender
对象获取tab id
。 - 代替回调函数,只需将选项卡 ID 发送到
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);
}
});
我希望这有所帮助。
相关文章:
- 如何收集所有发射回调的所有响应
- jQuery post,访问responseType或回调中的响应
- node.js+MySQL;JSON结果-回调问题&没有响应客户端
- 可以't从回调函数内部访问响应
- 回调返回响应,但当在API中发送时,响应在节点JS中显示为空白
- 挂起的回调:在每次回调返回之前返回响应
- Node.JS-如何识别哪个异步HTTPGET响应在回调中返回数据
- 具有一个响应的多个回调-Node JS
- React native:如何将参数传递给手势响应程序回调
- POST 响应未等待回调完成
- Facebook Javascript SDK 响应回调未触发
- GreaseMonkey 和 JQuery AJAX 响应不会以任何形式在回调中幸存下来
- 如何为每个 AJAX 请求/响应事件添加回调
- 节点.js如果我使用 process.send(),请等待回调/响应
- 如何在angularjs中使用factory在GPS检测器函数内部使用$http.post方法时获得回调响应
- 如何在ejb中处理回调响应
- 如何传递javascript回调响应到php
- 向数组添加多个回调响应
- Backbone.Wreqr 请求-响应处理程序的回调响应/状态(完成后)
- Strophejs获得花名册成功回调响应