JS: Асинхронное программирование
Теория: Promise.all
Промисы, как и колбеки, позволяют выполнять асинхронные операции параллельно. Причём умеют делать это в автоматическом режиме, без ручного отслеживания окончания одной из операций. Для этого достаточно собрать массив из промисов и передать их в функцию Promise.all. В результате вернётся обычный промис, на основе которого можно строить дальнейшую цепочку. Данными в первом then будет массив с данными всех выполненных операций.
Получился эффективный код, который еще и легко понять. К тому же здесь нет дополнительных переменных. Promise.all хоть и возвращает данные в том же порядке, в котором в него были переданы промисы, но не гарантирует последовательность выполнения операций. Не рассчитывайте на это никогда, все операции запускаются одновременно, и какая из них выполнится раньше или позже — неизвестно.
Функции Promise.all не важно, каким образом была получена коллекция промисов. Единственное, что ей нужно – получить на вход массив этих промисов. Поэтому Promise.all легко комбинируется с любыми функциями, возвращающими коллекции. В примере ниже дается массив путей до файлов, которые нужно прочитать и вывести на экран их содержимое. Первым делом в коде формируется массив из промисов, затем он передается в Promise.all и, наконец, содержимое файлов выводится на экран:
map проходится по каждому файлу, и отдает его в нашу функцию, которая выполняет вызов fsp.readFile(). Каждый такой вызов возвращает промис. Если попробовать распечатать этот массив, то он будет выглядеть так:
Promise.all всегда обрабатывает операции одновременно, и эти операции друг от друга никак не зависят. Это значит, что никакая ошибка (кроме остановки программы) не остановит запросы. Ошибка хотя бы в одном из промисов не помешает выполниться всем остальным запросам. Однако, если хотя бы один промис завершился с ошибкой, весь результат Promise.all будет помечен как ошибочный, а значит управление попадёт в ближайший catch. Чтобы этого избежать, можно передавать в Promise.all не просто промисы, а промисы с повешенными на них обработчиками ошибок catch, из которых уже возвращаются данные с пометкой об успешности.





