2013-08-22 3 views
0

У меня есть процесс, когда я должен отправить запрос 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(); 
} 
+2

Является ли ваш '// Do stuff' асинхронным? Потому что, если нет, 'Promise', возвращаемый' setQuestionStatus', уже * уже выполнен, прежде чем вы называть 'then' на нем. –

+0

Хорошая точка, но да, setQuestionStatus является асинхронным, поэтому def.resolve() только вызывается в обратном вызове ajax.success. Я должен был добавить немного подробностей в мой пример. – Appetere

+0

Сторона примечания: '.then (scheduler.start)' будет организовывать вызов 'start', но внутри вызова' this' не будет 'scheduler'. Вы можете захотеть '.then ($. Proxy (scheduler.start, scheduler)' или '.then (scheduler.start.bind (scheduler))' (в системах ES5). –

ответ

1
scheduler.stop().then(setQuestionStatus).then(scheduler.start); 

Моя проблема заключается в том, что, когда написано таким образом, setQuestionStatus и scheduler.start оба вызываются, как только scheduler.stop разрешается, а не после того, как каждый элемент в цепочке разрешен.

Это уродливое не-standard поведение, обнаруженное в более ранних версиях jQuery. Либо обновите свою копию до 1,8+ для использования then, либо используйте вместо этого pipe method.

+0

Genius! Обновлен jQuery и теперь работает как ожидалось. Большое спасибо. – Appetere

Смежные вопросы