代码之家  ›  专栏  ›  技术社区  ›  Josh Stodola

Ajax错误:完成此操作所需的数据不可用

  •  1
  • Josh Stodola  · 技术社区  · 15 年前

    每隔一段时间,当我向一个返回文本/纯文本类型的小响应的处理程序发出Ajax请求时,我会在IE中得到这个错误。似乎这个错误会开始发生,发生几次,然后就会停止。很烦人。

    我正在使用最新的jquery库。当我尝试访问xhr.responsetext时,该错误引发了complete()函数。我怎样才能防止这种情况发生?

      $.ajax({
        url: "Inquire.ashx",
        data: data,
        dataType: "text",
        timeout: 5000,
        complete: function(xhr, status) {
          var resp = xhr.responseText; // ERROR!
    
          if(resp.substr(0, 4) == "http")
            window.open(resp, "PopWin");
          else
            showError(resp);
        }
      });
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   JesDaw    15 年前

    我知道这个问题已经一个多月了,但我想我知道你的问题是什么。

    在调用success()或error()之后执行complete()回调。在您的情况下,我怀疑您的调用正超时,因此如果您提供了一个错误回调,它将触发,但在本例中,complete()将使用readystate 3进行调用。只需增加超时和/或检查此错误状态。

        2
  •  0
  •   Brock Boland    15 年前

    我没有直接使用jquery-ajax功能,所以我只是猜测一下,但是:

    你试过用吗 success 而不是 complete ?

    你试过别的吗 dataType S?基于 the jQuery documentation ,我不希望看到文本 数据库类型 返回一个对象,但如果它大部分时间都工作的话,这似乎不太可能是问题所在。

        3
  •  0
  •   Josh Stodola    15 年前

    事实证明,错误是由于 readyState xmlhttpRequest的属性为3,这意味着请求仍在处理中。我不明白为什么jquery在readystate为4之前触发了我的完整功能!我把它放在成功回调的最顶端,从那以后就没有看到错误了…

      if(xhr && xhr.readyState != 4) {
        setTimeout(arguments.callee, 50);
        return;
      }
    

    这是一个非常丑陋的解决方案,我讨厌,但它似乎解决了这个问题。