2016-02-09 2 views
1

Рассмотрим следующий код:Ответы на вызовы, отправленные в очередь событий?

 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 
+0

Не используйте jQuery отложенные. – Bergi

+0

Почему? А потом что использовать? –

+0

[Потому что] (http://stackoverflow.com/q/23744612/1048572) (И, по-видимому, они не делают то, о чем вы думали, что они действительно должны делать). Есть [много альтернатив] (https://promisesaplus.com/implementations), все из которых [будут работать с jQuery] (http://stackoverflow.com/a/31327725/1048572) – Bergi

ответ

0

Реализация JQuery из Promises не ECMAScript соответствует, например, JQuery обещания (на самом деле) не разрешаются на следующий цикл событий. Обещания jQuery будут совместимы с предстоящей третьей версией: jQuery.Deferred is now Promises/A+ compatible.

Примечание: Вы пытались запустить starter.resolve() в функции async? например: window.setTimeout(starter.resolve, 0); Выполнение этого тестового теста должно работать должным образом. Кстати, это не Promise-ошибка, но простой JQuery-плохой реализации, помните, что Jquery родился какой-то год до спецификации Promise

Для того, чтобы ответить на:

ли обезопасить обратные вызовы, отправленные в очередь событий?

Promise callbacks - это простые обратные вызовы javascript, поэтому, поскольку каждый простой обратный вызов javascript, даже обещающие обратные вызовы привязаны к циклу событий.

+0

Not каждый простой обратный вызов Javascript присоединяется к циклу Event. Например: [1,2,3,4,5]. Каждый (тест); callback ** test ** не привязан к циклу событий ... –

+0

Вы имели в виду 'at next eventloop'? – Hitmands

+0

Я имею в виду, что вышеупомянутый обратный вызов не выходит из нормального потока выполнения и ждет, пока исполняемый стек не станет пустым, чтобы быть вызванным из очереди событий и выполняться. Он полностью управляется с JS-движком. Я не понимаю, что вы подразумеваете под следующим eventloop ... –

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