2016-11-03 4 views
2

Bluebird имеет приятную функцию под названием Promise.map, которая позволяет передать дополнительный аргумент для количества параллельных операций.Есть ли способ использовать Promise.each Bluebird одновременно?

например.

yield Promise.map arrayOfThings, coroutine (thing) -> 
    newThing = yield thing.operate() 
    database.set newThing 
, concurrency: 500 

Однако Promise.map будет держать массив любых database.set newThing возвращается в памяти для всех arrayOfThings. Я бы предпочел не хранить все это в памяти, поскольку это забивает мой сервер. Оптимально я хотел бы заменить Promise.map на Promise.each, чтобы он не сохранял возвращаемые значения в памяти. К сожалению, это очень медленно, потому что Promise.each не является одновременным.

Есть ли способ изменить мой код, чтобы он работал так?

ответ

3

Прежде всего, на данный момент Promise.each фактически не выделяет массив. Для этого есть открытая проблема - меня назначили, и я хотел бы извиниться - я не перед коробкой разработчиков и был за границей. Я постараюсь исправить это в ближайшее время.

Прежде всего - нет. На данный момент такой функции нет. Promise.each был создан для того, чтобы точно управлять вещами последовательно. Запрос на растяжение может быть быть развлекательным, и его не должно быть слишком сложно реализовать сверху PromiseArray. Мы до сих пор не видели пример использования.

Между тем вы можете использовать Promise.map.

Смежные вопросы