jquery when / then(当when / done)不等待时

问题描述 投票:14回答:3

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

jquery ajax asynchronous deferred
3个回答
26
投票
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。


8
投票

这不是OP的问题,但是我发生了类似的事情,这是因为我通过传递一个promise数组错误地调用了$ .when(...)。


0
投票

您需要从GetHours函数返回$ .ajax的结果-像这样:

© www.soinside.com 2019 - 2024. All rights reserved.