Promise.all с $ q обещанием и циклом событий JS - PullRequest
0 голосов
/ 03 октября 2018

Допустим, у меня есть следующий код в пустом контроллере AngularJS:

Promise.all([Promise.resolve()]).then(() => console.log('Then'));
setTimeout(() => console.log('setTimeout callback')); 

Я ожидаю:

  1. Promise.all.then будет помещено в цикл обработки событий.
  2. setTimeout обратный вызов будет помещен в цикл обработки событий.

Мы не делаем длинных запросов и должен быть следующий вывод:
Then
setTimeout callback
И это работает.

Но если мы заменим Promise.resolve() на $q.resolve():

Promise.all([$q.resolve()]).then(() => console.log('Then'));
setTimeout(() => console.log('setTimeout callback'));

, результат будет другим:
setTimeout callback
Then

Вот плагин: https://embed.plnkr.co/0h0i4CzuSgqMbYQtxZtU/
Почему выход отличается?Как $q.resolve влияет на вывод?

1 Ответ

0 голосов
/ 03 октября 2018

Некоторые причины:

  • Promise.all не "обнаруживает" уже выполненные обещания и возвращает немедленно разрешенное обещание из-за этого.Он всегда ждет своих входных обещаний, используя их метод .then() (в любом случае ему также необходимо ассимилировать не родные обещания).Поскольку then обратные вызовы всегда являются асинхронными, результат Promise.all(…) всегда разрешается асинхронно (если только повторяемое не пусто), а обратный вызов Promise.all(…).then(…) запланирован позже
  • В очереди событий нет ни однойЦикл событий, но несколько для разных источников.Таким образом, даже если обещанные вещи занимают больше «тиков» цикла событий, их очередь просто обслуживается чаще, чем раньше, и раньше, чем очередь тайм-аута.
  • Мы не знаем, какой механизм использует $qдля того, чтобы сделать свои обещанные обратные вызовы асинхронными.Мы только знаем, что это не нативное обещание, и поэтому мы используем другую, по-видимому, «более медленную» очередь.

В общем, вы не можете (не должны) полагаться на асинхронные обратные вызовы, вызываемые влюбой конкретный заказ, кроме их документации, упоминает об этом.Делайте порядок явным (например, используя обещания), когда вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...