, потому что вниз по течению имеет ограничение по количеству запросов
Решение этого типа задачи ограничить число одновременных запросы, которые вы делаете. Использование задержки было бы просто предположением о том, как контролировать это, но не точно. Вместо этого вы должны буквально ограничить количество запросов, которые у вас есть в полете в одно и то же время.
Как я могу достичь того же?
К счастью для вас, Bluebird имеет опцию параллелизма именно для управления, сколько запросов в полете одновременно с методом Promise.map()
, установив опцию concurrency
. Допустим, вы обнаружили, что одновременно иметь два запроса в полете. Затем, вы можете сделать это:
return Promise.map(array, function (elem){
// perform an async call, return a promise from that async call
}, {concurrency: 2});
Это будет управлять итерации через массив, так что не более 2 асинхронных операций находятся в полете одновременно. Очевидно, вы можете установить concurrency
на любое значение, которое вам подходит.
Promise.mapSeries()
метод является частным случаем Promise.map()
с concurrency
уже установлен в 1. Таким образом, если вы действительно хотели, чтобы вызовы быть последовательными (с только один в полете в любой момент времени), то вы можете просто использовать Promise.mapSeries()
метод вместо этого.
Это фактически не добавляет задержки между вызовами. Он добавляет задержку, пока все вызовы не сообщают, что они сделаны, но на самом деле не изменяются при отправке запросов. По умолчанию 'Promise.map()' запускает все параллельно, поэтому ваш '.delay()' не изменяется, когда запросы отправляются вообще. Это только меняется, когда они сообщают, что они сделаны. – jfriend00