Рассмотрим следующий код:Ответы на вызовы, отправленные в очередь событий?
function wait(ms) {
var deferred = $.Deferred();
setTimeout(deferred.resolve, ms);
return deferred.promise();
}
var starter, promiseOne;
starter = $.Deferred();
promiseOne = starter.then(function() {
console.log("Calling promiseOne");
return wait(2000);
}).done(function() {
console.log('promiseOne done');
});
starter.resolve();
var now=new Date().getTime();
var stop=now+5000;
while (stop>new Date().getTime()){}
console.log('timeout finished');
Выполнив его, я получаю следующие результаты:
Calling promiseOne
timeout finished
promiseOne done
Я думал, что обещание обратные вызовы отправляются в очередь событий, поэтому я ожидал, что эти результаты :
timeout finished
Calling promiseOne
promiseOne done
Если не отправляет в очередь событий, я бы ожидать:
Calling promiseOne
promiseOne done
timeout finished
Может кто-нибудь объяснить мне, почему я получаю первую триаду?
P.S. Заменяя затем с сделал, я получаю:
Calling promiseOne
promiseOne done
timeout finished
Не используйте jQuery отложенные. – Bergi
Почему? А потом что использовать? –
[Потому что] (http://stackoverflow.com/q/23744612/1048572) (И, по-видимому, они не делают то, о чем вы думали, что они действительно должны делать). Есть [много альтернатив] (https://promisesaplus.com/implementations), все из которых [будут работать с jQuery] (http://stackoverflow.com/a/31327725/1048572) – Bergi