У меня есть процесс, когда я должен отправить запрос ajax на сервер, но вам нужно остановить планировщик до начала запроса ajax, а затем перезапустить планировщик, когда запрос будет выполнен.Цепочки jQuery обещания/отсрочки
я получил эту работу, используя следующий код:
scheduler.stop()
.done(function() {
setQuestionStatus().done(scheduler.start);
});
Но мне кажется, что там должна быть более простой способ, чтобы написать это, например:
scheduler.stop().then(setQuestionStatus).then(scheduler.start);
Моя проблема заключается в том, что, когда написанные таким образом, setQuestionStatus и scheduler.start называются , как только scheduler.stop разрешил, а не после того, как каждый элемент в цепочке разрешен.
Может ли кто-нибудь сказать мне, что я делаю неправильно во втором примере?
Для вашей информации, как scheduler.stop и setQuestionStatus вернуть обещание, используя шаблон:
var setQuestionStatus = function(){
return $.Deferred(function (def) {
// Do stuff
def.resolve();
}).promise();
}
Является ли ваш '// Do stuff' асинхронным? Потому что, если нет, 'Promise', возвращаемый' setQuestionStatus', уже * уже выполнен, прежде чем вы называть 'then' на нем. –
Хорошая точка, но да, setQuestionStatus является асинхронным, поэтому def.resolve() только вызывается в обратном вызове ajax.success. Я должен был добавить немного подробностей в мой пример. – Appetere
Сторона примечания: '.then (scheduler.start)' будет организовывать вызов 'start', но внутри вызова' this' не будет 'scheduler'. Вы можете захотеть '.then ($. Proxy (scheduler.start, scheduler)' или '.then (scheduler.start.bind (scheduler))' (в системах ES5). –