Сами обещания не имеют особых кодированных ограничений. Они просто система уведомлений, и вы могли бы иметь миллионы из них просто отлично (если у вас было достаточно памяти для хранения этих объектов Javascript).
Теперь, если обещание представляет лежащую в основе асинхронную операцию (что они обычно делают), вполне могут быть некоторые ограничения на то, сколько из этого конкретного типа асинхронной операции может выполняться одновременно. Например, в какой-то момент вы можете столкнуться с ограничением количества запросов, которые один хост будет принимать от вас одновременно. Или вы можете столкнуться с проблемами с локальными ресурсами из-за миллиардов соединений.
Для таких операций, как операции ввода-вывода диска node.js, в базовой подсистеме ввода-вывода диска уже имеется система очередей, так что на самом деле одновременно выполняется только небольшое количество операций, а остальные находятся в очереди.
Итак, чтобы ответить на вопрос о том, сколько параллельных операций вы можете выполнить, он может быть проанализирован и получен ответ только в контексте определенного типа асинхронного запроса и иногда даже определенного типа принимающего хоста.
Если вы знаете, что обрабатываете большой или потенциально большой массив запросов, и вы будете отправлять сетевой запрос для каждого элемента в массиве, то обычно кодируют ограничение самостоятельно, чтобы избежать перегрузки либо локальных ресурсов, либо целевые ресурсы хоста. Обычно это делается не с помощью очереди, а с помощью кода, который просто запускает N запросов, а затем, по окончании одного, запускает следующий и так далее. В библиотеках Bluebird и Async есть методы для управления этим за вас. В Bluebird это опция concurrency
для Promise.map()
. Я также сам вручную кодировал циклы, которые несколько раз управляют количеством одновременных соединений, и вот ссылки на этот код:
Promise.all потребляет всю мою оперативную память
Javascript - как контролировать количество обещаний доступа к сети параллельно
Сделайте несколько запросов к API, который может обрабатывать только 20 запросов в минуту
Цикл запроса API с переменным URL
Выберите правильный асинхронный метод для пакетной обработки для максимальных запросов / сек
Nodejs: асинхронный запрос со списком URL