Javascript Chrome取消了一个XMLHttpRequest(然后立即启动一个成功的)?

Javascript Chrome取消了一个XMLHttpRequest(然后立即启动一个成功的)?,javascript,Javascript,我正在尝试使用page.js创建一个非常基本的客户端路由器。其思想是,当您访问路线时,如果尝试使用render方法,则render方法将找到您传递给它的视图(必要时从服务器检索),然后使用lodash模板插入视图,最后将其显示给用户。然而,我遇到了一个奇怪的现象。尽管下面的例子工作得非常完美,但我在我的Chrome网络日志中看到了这一点: (上图很小,下面是链接:) 现在,我向/templates/index.html发出了一个请求,我可以验证这两个请求是否都代表一个指向完全相同位置的XHR(

我正在尝试使用page.js创建一个非常基本的客户端路由器。其思想是,当您访问路线时,如果尝试使用
render
方法,则
render
方法将找到您传递给它的视图(必要时从服务器检索),然后使用lodash模板插入视图,最后将其显示给用户。然而,我遇到了一个奇怪的现象。尽管下面的例子工作得非常完美,但我在我的Chrome网络日志中看到了这一点:

(上图很小,下面是链接:)

现在,我向
/templates/index.html
发出了一个请求,我可以验证这两个请求是否都代表一个指向完全相同位置的XHR(也就是说,它们都指向
/templates/index.html
)。这是我的路由器代码(是的,我知道它需要重构):

home.index-这与上面示例中的
thisContext
绑定

  function index(context, next) {
    this.render('index', { foo: 'bar' });
  }

这利用了
require
lodash.template
(npm)和
页面
(npm)的Browserify来实现其目标。如前所述,结果显示正确,这就是为什么我对显示此错误感到困惑的原因。有趣的是,这个问题只会在Chrome中出现-但在Chrome上的私人浏览过程中不会出现,在Chrome Canary中也不会出现。

这个问题是由于Chrome的“功能”造成的,当您打开调试控制台时会出现该功能。已经有这样的报道。Chromium的问题追踪器上也有报道,谷歌不会修复它,因为它已经在最新的金丝雀版本中修复

我只想重申上一个问题的答案 加布里埃尔,所以一定要在那里投票:

为了使代码始终在调试模式下工作,我找到了两个选项:

  • 使用onload验证XMLHTMLRequest W3C规范是否成功

    client.onload=handler

    此版本在IE8中不起作用。它一定是一个 实现XMLHttpRequestEventTarget接口

  • 完成状态后,立即删除onreadystatechange处理程序

    client.onreadystatechange=function(){
    //检查请求是否完成
    if(this.readyState==this.DONE){
    if(this.onreadystatechange){
    client.onreadystatechange=null;
    handler();
    }
    }
    };


  • 如果在脚本中添加任何控制台日志,是否会多次调用
    render
    ?是否在其他浏览器(如Firefox)中检查代码?如果这个问题只是由Chrome引起的,那么它可能是Chrome扩展问题?@KevinB是的,它肯定不止一次地调用它(请看第24行)。但是,只有当
    viewName
    不是
    viewCache
    中的一个键时,它才会达到这一点。确实如此。@Hassan我在Chrome Canary中测试过它,但没有出现在Chrome Canary中,我也在Chrome的私人浏览中测试过它(同样没有效果)。Chrome Canary没有我的插件。这可能与AdBlock有关,但我在私人浏览中启用了AdBlock。我没有其他插件。请求可以被取消的情况很少:用户按esc键,加载时从dom中删除图像,仍在加载时更改iframe src,或者在ajax请求当前正在进行时离开页面,在您的情况下,几乎可以排除所有这些情况。我猜这是一个扩展。我在私人浏览中也打开了开发工具。我的代码工作得很好,只是有一个奇怪的被取消的请求。我不完全确定这是正确答案。如果使用
    onLoad
    ,看看问题是否消失。谷歌可能已经在匿名模式下修复了这个问题,但自从它被报道后就没有在正常模式下修复?
      function index(context, next) {
        this.render('index', { foo: 'bar' });
      }