一尘不染

jQuery何时/然后(也何时/完成)不等待

ajax

我看过许多使用这种语法的示例,但是看不到我做错了什么。“ 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也是异步调用的一部分。


阅读 190

收藏
2020-07-26

共1个答案

一尘不染

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。

2020-07-26