【发布时间】:2012-09-05 09:18:41
【问题描述】:
我有一个基本上看起来像这样的函数:
function defTest()
{
var dfd = new jQuery.Deferred();
$.ajax(
{
type: "GET",
url: 'http://XXXX',
cache: false,
dataType: "json",
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
},
error: function(data,status)
{
console.log('ajax done: fail');
dfd.reject();
}
});
console.log('about to return dfd');
return dfd;
}
我这样称呼它:
defTest().then(.....);
控制台日志产生以下内容: 即将返回 dfd code.js:106 ajax 完成:成功 code.js:96
让我感到困惑的是代码似乎可以工作。仍然在 ajax 完成之前返回 dfd。所以我删除了return dfd。并将它放在每个 ajax 处理函数的最后,以确保在 Ajax 完成之前不会返回它。:
success: function(data,status)
{
console.log('ajax done: success');
dfd.resolve();
return dfd;
}
然后它根本不起作用。我很迷惑!有人可以向我解释为什么我的 deferred 不能在 ajax 成功和错误处理程序中,为什么即使我的 deferred 对象在 Ajax 完成然后被解决或拒绝之前被触发,它似乎也返回了?这怎么可能?
编辑: 这个问题与我之前未回答且更复杂的功能直接相关: Problems with deferred object
这就是为什么我不能只“返回 ajax(...)”,因为我的真实函数包含其他 ajax 调用,这些调用将与一个返回给调用者的结果分开。
【问题讨论】:
-
XY problem。您无法从您的函数返回异步操作结果,这看起来就像您正在尝试做的那样。
-
这就是我试图使用延迟对象解决的问题。
-
$.ajax已经在 xdazz 回答时返回了一个延迟对象。 JavaScript 是单线程的,函数调用是同步的,并且必须同步返回一个值(或什么都不返回)。$.ajax是异步的。您可以(并且应该)做的是使用 ajax 成功回调来完成 ajax 请求完成后必须做的事情。 -
@Fabricio 感谢您的评论。但我不能只返回 ajax(),因为它不能解决我的问题……看看我在帖子中编辑的部分。