Ниже приведенный ниже нефункциональный пример должен объяснить, что я пытаюсь сделать, я просто не понимаю шаблон, который мне нужно использовать для его выполнения. Я попробовал поиск в Google, чтобы понять опрос и отложить, но я не мог найти ничего, что мог бы понять.
У меня есть функция, которая опроса API, и я хочу дождаться, пока этот опрос вернет ожидаемый результат (ожидая, что конечная точка укажет, что что-то изменилось), прежде чем продолжить мою основную функцию. Что я делаю не так?
Edit: Я хотел бы добавить, что КАЖЕТСЯ пойти не так с кодом ниже, что даже если deferred.resolve()
в конечном итоге получает называется, кажется, что это не то же самое deferred
, что получил вернулся, так что when
никогда не активируется в main()
. Я предполагаю, что это связано с таймаутом, то есть deferred
получить clobbered на первом повторе. Это мое предположение, так или иначе.
function pollAPI() {
var deferred = $.Deferred();
$.ajax({
url: url,
contentType: 'application/JSON',
method: 'GET'
}).done(function(data){
if (!desiredResult) {
setTimeout(function() {
pollAPI();
}, 1000);
} else {
deferred.resolve();
}
}).error(deferred.reject());
return deferred.promise();
}
function main() {
$.when(pollAPI()).then(function() {
// do something now that the API has returned the expected result
});
каждый вызов pollAPI не создает новый отложенный, ничего получает затерт - попробуйте 'deferred.resolve (pollAPI())' в SetTimeout –
Wouldn» t, что приводит к тому, что первая отсрочка будет разрешаться, тем самым вызывая «когда», даже если она не готова? – fildred13
Да, это решит еще нераскрытое обещание - так что не должно быть проблемой - см. Раздел 2.3 в [Promise/A + specification] (https://promisesaplus.com/) - jquery, возможно, следует этой спецификации, но там являются значительными отклонениями от спецификации Promise/A + в некоторых более ранних версиях jQuery –