2016-03-08 4 views
1

Я обрабатываю массив, используя Promise.map. Для каждого элемента я выполняю операцию async, которая возвращает обещание. Тем не менее, я хочу ввести некоторую задержку между каждым вызовом, потому что нисходящий поток имеет ограничение на количество запросов. Вот что я хочу сделатьBluebird.js: Как добавить wait для каждой итерации Promise.map?

return Promise.map(array, function (elem){ 
    // perform an async call using elem 
    // wait for 500 ms 
}) 

Как я могу достичь того же?

ответ

2

, потому что вниз по течению имеет ограничение по количеству запросов

Решение этого типа задачи ограничить число одновременных запросы, которые вы делаете. Использование задержки было бы просто предположением о том, как контролировать это, но не точно. Вместо этого вы должны буквально ограничить количество запросов, которые у вас есть в полете в одно и то же время.

Как я могу достичь того же?

К счастью для вас, 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() метод вместо этого.

0

Допустим, вы добавляете какой-либо функции, как добавить в функции отображения

function add(value) { 
    return new Promise(function (resolve) { 
     // some operations 
     resolve(value + 1); 
    }).then(function (newValue) { 
     return // result; 
    }); 
} 

Вы можете задержать его по добавить .dealy()

например

return Promise.map(array, function (elem){ 
    // perform an async call using elem 
    // wait for 500 ms 
    return add(1).delay(500); 
}) 

надеюсь, что эта информация поможет вам.

+1

Это фактически не добавляет задержки между вызовами. Он добавляет задержку, пока все вызовы не сообщают, что они сделаны, но на самом деле не изменяются при отправке запросов. По умолчанию 'Promise.map()' запускает все параллельно, поэтому ваш '.delay()' не изменяется, когда запросы отправляются вообще. Это только меняется, когда они сообщают, что они сделаны. – jfriend00

4

Задержка не поможет, так как все элементы массива все еще будут обрабатываться (или начать обрабатывать) в одно и то же время.

Вы должны установить concurrency option

return Promise.map(array, function (elem){ 
    // perform an async call using elem 
    // wait for 500 ms 
}, {concurrency: 1}) 
Смежные вопросы