【问题标题】:Returning data from ajax results in strange object从ajax返回数据会导致奇怪的对象
【发布时间】:2012-09-21 13:17:27
【问题描述】:

我知道这个问题可能已经被问过一千次了,但我似乎找不到答案。我希望result 是ajax-request 返回的数据,它应该是一个json-data 数组(console.log(data) 的结果)。

  var result = $.ajax({
    type: 'GET',
    url: dataPath,
    dataType: 'json',
    success: function(data) {
      console.log(data)
      },
    error: function(){
      //alert("damn");  
      },
    data: {},
    aync: false
  });

  console.log(result); 

但是,console.log(result); 会返回一些奇怪的对象,我不知道如何处理。为什么不是result = data

【问题讨论】:

  • 你得到了什么数据(例子)?您期望什么数据(示例)?尝试console.dir 而不是concole.log
  • @dystroy:不是重复的。那是关于异步调用,但 OP 尝试进行同步调用。
  • @Guffa 你是对的。但实际上唯一可接受的答案是那些向 OP 解释为什么尝试进行同步调用非常糟糕的答案。
  • OP,请注意 async: false 现已弃用。
  • @dystroy:看起来不像……api.jquery.com/category/deprecated

标签: javascript jquery ajax json


【解决方案1】:

错字。

改变这个:

aync: false

到:

async: false

ajax 方法仍然返回执行请求的 jqXHR 对象,而不是结果。在success 调用中使用data 参数并将其存储在某处。

【讨论】:

  • 为什么投反对票?如果你不解释你认为错误的地方,它就无法改进答案。
  • 我没有投反对票,但我认为这真的对 OP 没有帮助。 aync: false 是一个拼写错误,但async: false 通常是一个概念错误。
  • @dystroy :真的代码出了什么问题。方法好不好,那是另外一回事了。
【解决方案2】:

首先从您的代码中删除aync: false。它应该拼写为async: false,但您不需要它来实现您的目标,它实际上所做的是阻止整个浏览器的用户界面,从而导致糟糕的用户体验。请记住,AJAX 中的“A”表示异步

$.ajax() 调用的结果是一个promise,它与您的数据不同,但它仍然可以用于获取您的数据。你只需要以某种方式使用它。

尝试改变:

 console.log(result);

到:

result.done(function (data) { 
    console.log(data);
});

或:

result.done(function (data) { 
    console.dir(data);
});

甚至这可能有效 - 未经测试:

result.done(console.dir);

请参阅this answer 以获得更好的解释。

【讨论】:

  • 不,结果不是承诺。 OP 正在尝试进行同步调用,而不是异步调用。
  • @Guffa 在同步调用的情况下,该承诺已经解决,但它仍然是一个承诺。使用这个承诺在文档中被标记为 deprecated,但显然情况仍然如此。
  • 在这种情况下阻止整个浏览器并不是明智之举。使用带有承诺的异步调用要好得多。我的建议是从不使用同步 AJAX(SJAX?)EVER
  • @Guffa 是的,这显然是错误的方式,我们的责任是提供更好的方法。
  • @Guffa 没错,我应该这样做,顺便说一句,这就是我所做的。 :)
【解决方案3】:

success 函数中初始化result

 var result;
  $.ajax({
        type: 'GET',
        url: dataPath,
        dataType: 'json',
        success: function(data) {
          result = data;
          console.log(data)
          },
        error: function(){
          //alert("damn");  
          },
        data: {},
        async: false
      });

      console.log(result);

【讨论】:

    【解决方案4】:

    有一个小拼写错误 aync: false 应该读作 async: false 当然假设您需要同步运行请求,即让您的代码的其余部分等待此结果。

    我认为这里的主要问题是您尝试输出到控制台的结果没有被 ajax 请求引用。

    您完全可以选择引用 ajax 请求返回的数据的方式,您选择了 data 这个词,这很容易是 result 或 json_Data 或 return_Data 或 ....

    因此,我建议将 ajax 请求的结果发送到控制台:

    var result = $.ajax({
        type: 'GET',
        url: dataPath,
        dataType: 'json',
        success: function(result) {
          console.log(result)
          },
        error: function(){
          //alert("damn");  
          },
        data: {},
        async: false
      });
    

    【讨论】:

      【解决方案5】:

      你提到console.log(result)返回一个奇怪的对象,实际上这个奇怪的对象被称为xhr (XMLHttpRequest)对象。

      由于来电是syncronous,因为async: false所以很容易得到returned data的赞

      var result = $.ajax({...}); // get the xhr object in to result
      console.log(result.responseText); // xhr object has a "responseText" property
      

      因为result.responseText 仅在请求完成后可用,并且由于async:false 没有机会执行此console.log(result.responseText);,所以在request 完成之前因为syncronous ajax 请求挂在之前的所有内容上它完成了请求。

      在您的success 回调中data 将是一个对象,因为dataType: 'json' 但在success 回调之外,即console.log(result.responseText); 将只是文本,因此要将其用作对象,您必须将其转换为使用$.parseJSON(result.responseText) 的对象。

      【讨论】:

        猜你喜欢
        • 2015-04-25
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        • 1970-01-01
        相关资源
        最近更新 更多