core-js-101 icon indicating copy to clipboard operation
core-js-101 copied to clipboard

06-promises-tasks.js

Open Elijah-I opened this issue 2 years ago • 3 comments

Я заметил что тут неправильно сделаны тесты.

Если я все так понял - суть промисов в асинхронности, но тесты принимают синхронный код потому что использутеся

const promises = [ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3) ]

которые резолвятся тут же

Я вроде как понимаю, что из стека вызова они все равно уходят в асинхронное web API, оттуда попадают в Task Queue и уже потом возвращаются в stack. Но тем не менее просто синхронный код через for проходит тесты. А если добавить реальной задержки промису:

const promises = [ new Promise((res) => { setTimeout(() => res(1), 1000) }), Promise.resolve(2), Promise.resolve(3) ]

вот тогда все сломается как и положено и синхронный код уже не пройдет тест

Elijah-I avatar Nov 27 '22 09:11 Elijah-I

"вроде как понимаю, что из стека вызова они все равно уходят в асинхронное web API" -> нет, не понимаешь. Если промисы уходят в web api, то для чего тогда нужен Task Queue, и в чем разница между ним и web api ?

DimaBLR avatar Nov 27 '22 20:11 DimaBLR

в тестах не учтено, что промисы могут резолвиться разное количество времени и соответственно значения могут поменять свой порядок в результирующем массиве если их туда пушить, а не присваивать по индексу, а так же конфиг линтера настроен таким образом, что он не позволяет создать счётчик и написать проверку, что бы резолвить результирующий массив, когда, количество в нем значений (без пустот) будет соответствовать исходному массиву с промисами

bloodsuckers-spb avatar Nov 27 '22 21:11 bloodsuckers-spb

"вроде как понимаю, что из стека вызова они все равно уходят в асинхронное web API" -> нет, не понимаешь. Если промисы уходят в web api, то для чего тогда нужен Task Queue, и в чем разница между ним и web api ?

Ну как я себе это вижу:

  1. из стека вызова асинхронщина уходит как задача в web api, соответственно в стеке она убирается, как выполненная
  2. когда асинхронный код выполнится в web api он поместит результат выполнения в Task Queue
  3. event loop следит за Task Queue и стеком. Как только в стеке закончатся задачи - event loop начнет брать по очереди то, что есть в Task Queue и закидывать в стек

Т.о. даже если время резолва промиса = 0, то он все равно попадет в web api, там мгновенно зарезолвится и затем то, что он вернул попадет в Task Queue, а оттуда обратно в стек уже после того, как все синхронные задачи в стеке будут выполнены

Elijah-I avatar Nov 28 '22 06:11 Elijah-I