我看过许多使用这种语法的示例,但是看不到我做错了什么。“ then”函数在ajax调用返回之前正在运行。
我也尝试过使用$ .deferred和其他一些模式无济于事。
有人可以看到我所缺少的吗?
我已经调试,可以看到在ajax调用返回其成功(或错误)数据之前,已完成/然后内部进行的调用。
谢谢你的帮助。
主要电话:
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()创建的),它首先调用它。当承诺成功解决时,函数arg。
因此,您的GetHours需要返回一个when()可以包装的Promise,然后调用then()。您实际上可以跳过when()部分,而只需从GetHours返回时调用.then即可。
您不会收到错误,因为.when()也可以使用任何旧对象,并且如果未实现Promise接口,它只会将其视为已完成的Promise。