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]); });
关键排查点
- 确认
done回调函数的参数是否正确接收(必须写function(result)而不是空参数) - 用
fail回调排查是否有请求错误(比如后端返回的JSON格式有语法问题,会触发失败回调) - 不要用
async: false同步请求,这会打乱Deferred的正常异步逻辑
内容的提问来源于stack exchange,提问作者Ismail
相关产品推荐
相关产品推荐

