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 является частью асинхронного вызова.
Ответы
Ответ 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.