[我看过许多使用此语法的示例,但看不到我做错了。“ then”函数在ajax调用返回之前正在运行。
我也尝试过使用$ .deferred和其他一些模式都无济于事。
有人可以看到我所缺少的吗?
我已经调试,可以看到在ajax调用返回其成功(或错误)数据之前从done / then内部进行的调用。
感谢您的帮助。
主要电话:
this.addFirstTask = function(task) {
var totalHours = GetHours();
$.when(totalHours).done(function (data) {
task.TaskHours(data);
self.add(task);
});
};
它正在调用以下ajax函数:
function GetHours() {
$.ajax({
url: "/api/tst/GetMyData",
type: 'GET',
dataType: 'json',
success: function(data) {
return data;
},
error: function(data) {
return 0;
}
});
};
谢谢!
验尸:
除了将返回值添加到ajax调用之外,根据其他建议,我还从ajax调用中删除了成功与错误,并将addFirstTask更改为:
this.addFirstTask = function(task) {
var totalHours = GetHours();
$.when(totalHours)
.then(function (data) {task.TaskHours(data);})
.done(function () { self.add(task); });
};
如果GetHours成功,我将更新TaskHours值。如果失败,我就跳过它。我意识到DONE就像.NET的try / catch中的“ FINALLY”。因此,与其立即添加任务,然后让我的可观察的绑定在值返回时更新它,甚至self.add也是异步调用的一部分。
function GetHours() {
return $.ajax({
...
});
};
$。ajax()返回一个Promise。$ .when()接受一个Promises的集合,并返回一个Promise,该Promise在所有输入的Promise完成时就完成.then()是Promise的一种方法(在这种情况下,是包装器Promise的when()创建的),当Promise成功解决时,调用它的第一个函数arg。
因此,您的GetHours需要返回一个when()可以包装的Promise,然后调用then()。您实际上可以跳过when()部分,而仅在GetHours返回时调用.then。
您不会收到错误,因为.when()还会带任何旧对象,并且如果它不实现Promise接口,它只会将其视为已完成的Promise。
这不是OP的问题,但是我发生了类似的事情,这是因为我通过传递一个promise数组错误地调用了$ .when(...)。
您需要从GetHours函数返回$ .ajax的结果-像这样: