You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Deferred结果传递异常:Ajax请求数据在done回调中为空求助

解决Ajax Deferred done回调无法获取数据的问题

你遇到的情况其实很常见——明明success回调能正常输出数据,但用Deferred的done方法却好像拿不到值,这大概率不是数据真的为空,而是你对Deferred的回调参数处理或者使用方式有偏差。

先看核心问题:$.ajax()返回的jqXHR对象本身就实现了Deferred接口,所以你的request()函数返回这个对象是完全没问题的。问题出在done回调的使用细节上,我给你拆解下解决方案:

第一步:简化你的request函数

你完全不需要依赖success回调来验证数据,Deferred的done已经能处理成功回调逻辑,先把代码简化:

function request(cat) {
  return $.ajax({
    url: 'query.php',
    type: 'POST',
    data: { Category: cat },
    dataType: 'json'
  });
}

第二步:正确使用done回调

你之前可能没在done里正确接收数据参数,或者没处理潜在的请求失败情况。试试这样调用:

request('你的分类参数').done(function(result) {
  if (result) {
    console.log(result[0]); // 这里应该能和success回调里输出一样的内容
  }
}).fail(function(xhr, status, error) {
  // 一定要加失败回调!很多时候看似数据为空,其实是请求有隐性错误(比如JSON格式不合法)
  console.error('请求出错:', error);
});

为什么之前的success能拿到数据?

当你在$.ajax里定义success回调时,它只是jQuery额外提供的快捷回调,不会影响Deferred的done回调接收数据。如果之前done里没看到数据,大概率是你没给done的回调函数设置参数,或者没排查到请求失败的情况。

如果你一定要保留success回调

即使保留success,也不影响done的使用,两者可以共存:

function request(cat) {
  return $.ajax({
    url: 'query.php',
    type: 'POST',
    data: { Category: cat },
    dataType: 'json',
    success: function(result) {
      console.log('success回调输出:', result[0]);
    }
  });
}

// done依然能正常拿到数据
request('你的分类参数').done(function(result) {
  console.log('done回调输出:', result[0]);
});

关键排查点

  1. 确认done回调函数的参数是否正确接收(必须写function(result)而不是空参数)
  2. 用fail回调排查是否有请求错误(比如后端返回的JSON格式有语法问题,会触发失败回调)
  3. 不要用async: false同步请求,这会打乱Deferred的正常异步逻辑

内容的提问来源于stack exchange,提问作者Ismail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:34:23