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

我在谷歌浏览器中构建了一个扩展,用于发布针对网站的查询。

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

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

如果我使用.ajaxError()注册一个事件处理程序,那么错误会被捕获,但是从这个事件处理程序,我显然无法调用sendResponse(),因为我得到以下Chrome错误:

“尝试使用断开的端口对象”

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

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


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

  • 异步响应 :您可以立即向内容脚本发送一个空响应,然后启动到内容脚本的新连接以发送响应。 内容脚本需要为消息添加一个侦听器。 很明显,如果你正在制作多个这样的请求,你需要来回传递一些令牌,以便你可以将回复与原始请求进行匹配。
  • 使用$.ajax() :这允许你指定内联成功和错误回调; 如果您可以成功从回调中成功sendResponse ,则您还应该能够从错误回调中进行发送。
  • 创建一个长期生活的端口 :长期生活的连接让您可以随时向内容脚本发布消息。
  • 如果您存储了sendResponse函数以便它可以被错误处理程序访问,但是您可能已经证明已经错误(希望看到您的代码),我还想要从一个完全独立的函数调用sendResponse )。 文档使得听起来就像请求被打开,直到响应。


    在查看代码后,看看我是否可以提取一些代码来构建一个工作示例(针对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);
        }
    
    链接地址: http://www.djcxy.com/p/91157.html

    上一篇: Chrome extension message passing, when xhr call fails in jQuery

    下一篇: Other ways of checking if a class has a certain member function