Подтвердить что ты не робот

Jquery когда /then (также когда/сделано) не ждет

Я просмотрел множество примеров, которые используют этот синтаксис, но я не вижу, что я делаю неправильно. Функция "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;
        }
    });
};

Спасибо!

post mortem:

в дополнение к добавлению возврата к вызову 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. Поэтому вместо того, чтобы сразу добавлять задачу, а затем позволяя моему наблюдаемому привязке обновлять ее, когда значение возвращается, даже self.add является частью асинхронного вызова.

4b9b3361

Ответ 1

function GetHours() {
    return $.ajax({
        ...
    });
};

$. ajax() возвращает Promise. $.when() принимает коллекцию Promises и возвращает обещание, которое завершается, когда все входные данные promises завершаются .then() - это метод Promise (в этом случае обертка Promise, которая когда() была создана), которая называет ее первой функцией arg, когда обещание разрешается с успехом.

так что ваш GetHours должен вернуть Promise, который когда() может обернуть, и вы вызываете then() on. вы могли бы фактически пропустить часть when() и просто позвонить, а затем вернуться из GetHours.

вы не получаете ошибку, потому что .when() также принимает любой старый объект, и если он не реализует интерфейс Promise, он просто рассматривает его как уже выполненное обещание.

Ответ 2

Это не проблема с OPs, но у меня было что-то подобное, и это произошло потому, что я неправильно вызывал $.when(...), передавая массив promises.

В документации для jQuery.when, если вы хотите подождать несколько объектов с отсрочкой, вы должны сделать вызов как таковой:

$.when( d1, d2 ).then(....);

Это означает, что если у вас есть несколько отложенных объектов в массиве, вы должны использовать apply (...), иначе $.when будет работать неправильно. Таким образом, ваш вызов массива отложенных объектов будет выглядеть следующим образом:

$.when.apply(this, arrayOfDeferred).then(....);

Вот пример скрипта JS:

https://jsfiddle.net/Lvo4hrez/11/

Ответ 3

Вам нужно вернуть результат $.ajax из функции GetHours.