首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未发送Chrome扩展sendResponse回调值

未发送Chrome扩展sendResponse回调值
EN

Stack Overflow用户
提问于 2016-02-06 05:15:20
回答 1查看 821关注 0票数 6

我正在编写一个与gmail交互的chrome扩展(我的版本是chrome 45 ),并且我在将消息从background.js发送到我的内容脚本时遇到了问题。异步方面是问题所在。我怎样才能在回电话后得到要发送的消息?

代码语言:javascript
运行
复制
//---------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 Extension Message passing: response not sent

EN

回答 1

Stack Overflow用户

发布于 2016-02-07 08:54:47

您应该在回调中发送sendResponse函数。

代码语言:javascript
运行
复制
getMessage('me', request.messageId, sendResponse);

然后,当您的getMessage调用完成时执行此命令。

代码语言:javascript
运行
复制
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});
    });
}

另一种可能的解决方案:

  1. tab id对象获取sender
  2. 与回调函数不同,只需将选项卡id发送到getMessage函数即可。
  3. 现在,getMessage函数中的回调函数将向内容脚本发回有效负载。
  4. 在内容脚本中添加一个类似的onMessage侦听器,该监听器将接收有效负载,然后对有效负载执行您想做的事情。

您的代码应该是:

代码语言:javascript
运行
复制
//---------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);
    }
});

我希望这能帮到你。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35237621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档