core-js-101
core-js-101 copied to clipboard
06-promises-tasks.js
Я заметил что тут неправильно сделаны тесты.
Если я все так понял - суть промисов в асинхронности, но тесты принимают синхронный код потому что использутеся
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) ]
вот тогда все сломается как и положено и синхронный код уже не пройдет тест
"вроде как понимаю, что из стека вызова они все равно уходят в асинхронное web API" -> нет, не понимаешь. Если промисы уходят в web api, то для чего тогда нужен Task Queue, и в чем разница между ним и web api ?
в тестах не учтено, что промисы могут резолвиться разное количество времени и соответственно значения могут поменять свой порядок в результирующем массиве если их туда пушить, а не присваивать по индексу, а так же конфиг линтера настроен таким образом, что он не позволяет создать счётчик и написать проверку, что бы резолвить результирующий массив, когда, количество в нем значений (без пустот) будет соответствовать исходному массиву с промисами
"вроде как понимаю, что из стека вызова они все равно уходят в асинхронное web API" -> нет, не понимаешь. Если промисы уходят в web api, то для чего тогда нужен Task Queue, и в чем разница между ним и web api ?
Ну как я себе это вижу:
- из стека вызова асинхронщина уходит как задача в web api, соответственно в стеке она убирается, как выполненная
- когда асинхронный код выполнится в web api он поместит результат выполнения в Task Queue
- event loop следит за Task Queue и стеком. Как только в стеке закончатся задачи - event loop начнет брать по очереди то, что есть в Task Queue и закидывать в стек
Т.о. даже если время резолва промиса = 0, то он все равно попадет в web api, там мгновенно зарезолвится и затем то, что он вернул попадет в Task Queue, а оттуда обратно в стек уже после того, как все синхронные задачи в стеке будут выполнены