当jQuery中的xhr调用失败时,Chrome扩展消息传递

时间:2010-11-15 14:40:10

标签: jquery google-chrome-extension

我正在Google Chrome中构建一个针对网站发布查询的扩展程序。

根据“内容脚本”的请求,“背景页面”发出查询;当后台页面收到发出查询的请求时,它会发送查询,解析响应并使用sendResponse()将响应发送回内容脚本。

使用XMLHttpRequest()时一切正常;但我的问题是,如果我想使用jQuery .get()或.load()发出查询,那么当查询失败时,它们会以静默方式失败,并且响应永远不会发送到内容脚本。

如果我使用.ajaxError()注册事件处理程序,则会捕获错误,但是从此事件处理程序中我显然无法调用sendResponse(),因为我收到以下Chrome错误:

“正在尝试使用断开连接的端口对象”

搜索此错误只会检索找到此文本的Chrome的源代码,因此不太有帮助。

简而言之,我的问题是:是否可以在Chrome扩展程序的后台脚本中使用jQuery.get(),并且在请求失败时仍能够向内容脚本发送响应? (如果是,如何)

2 个答案:

答案 0 :(得分:1)

如果没有代码示例,这很难直接解决(你如何将sendResponse传递给错误处理程序?),但我认为有一些替代方法可以自己构建XHR。

  • 异步响应:您可以立即向内容脚本发送空响应,然后再启动与内容脚本的新连接以发送响应。内容脚本需要为消息添加一个监听器。显然,如果您正在制作多个这些请求,您需要来回传递一些令牌,以便您可以将响应与原始请求进行匹配。
  • 使用$.ajax() :这允许您指定内联的成功和错误回调;如果您可以从成功回调中成功sendResponse,那么您也应该能够从错误回调中获得。
  • 创建一个长期存在的端口long-living connections允许您随时向内容脚本发布消息。

我还想你可以从一个完全独立的函数调用sendResponse,如果你存储了sendResponse函数,以便错误处理程序可以访问它,但也许你已经证明了已经错了(很想看到你的代码)。该文档使得它听起来像请求被打开,直到它被响应。

答案 1 :(得分:0)

在查看代码后,看看我是否可以提取一些代码来构建一个工作示例(响应serg注释),我不认为我想用jQuery做什么。

在jQuery中,当ajax调用失败时,会调用一个错误事件(因为它被.ajaxError()事件处理程序捕获),然后函数结束/返回。当.ajaxError()处理程序运行时,该函数因此失效。 (我相信,这是JS中异步事件系统的重点)。

现在,我只是在猜测,但我认为在Chrome中,当监听器功能运行时,内容脚本和后台脚本之间的通信通道将被关闭;在侦听器函数结束后,无法从后台脚本向内容脚本发送响应,这是我在处理事件处理程序中的ajax错误时尝试做的事情。

所以,我最终做的是重新实现一个实际发回一个完整对象的ajax函数:如果调用失败,它会返回一个错误以及错误代码的事实,以便调用函数(实际上是一个回调函数)可以处理它并将响应发送回内容脚本。

它只有几行,而且(我认为)非常通用,所以这里是:

function xhr(url, callback) {
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.onreadystatechange = function() {
        if (req.readyState == 4) {
            var resp = {
                "url": url,
                "status": req.status
                };
            if (req.status == 200) {
                resp.html = req.responseText;
                resp.outcome = "ok";
                }
            else {
                resp.outcome = "error";
                }
            callback(resp);
            }
        }
    req.send(null);
    }