2015-09-04 3 views
3

Есть способ перебрать массив идентификаторов в кусках и дождаться ответа этого куска, чтобы продолжить цикл?Bluebird - Как перемещаться по массиву в кусках, ожидая ответа куска

например:

Promise = require("bluebird") 

function(array){ 
    return Promise.*something that will loop chunks from my array and wait for each chunk response*.map(function(id){ 
      return myfunction(id); 
     }); 
} 

Моя проблема заключается в том, что мне нужно ждать ответа от БД, что я обращающегося, и он не может ответить на все вызовы, которые я создаю в то же время. Мой код поднимает исключение тайм-аута, потому что я слишком агрессивен.

мой код ниже:

Promise = require("bluebird") 

function(array){ 
return Promise.map(array, function(id){ 
     return myfunction(id); 
     }); 
} 

EDIT: Я нашел решение!

Promise = require("bluebird") 

function(array){ 
return Promise.map(array, function(id){ 
     return myfunction(id); 
     }, {concurrency: 10}); 
} 

ответ

1

Если все в порядке с не использованием обещаний, то async модуля имеет много способов справиться с этими сценариями. Вы можете использовать eachSeries(), если хотите сделать один запрос за раз. Если вы хотите быть более эффективным, вы можете использовать parallelLimit, что гарантирует, что обратные вызовы max X будут запущены одновременно.

Существуют также версии асинхронных версий, такие как async-q и порты с поддержкой bluebird.

+0

Да, мне нужно, чтобы это было обещание. Что такое порты с обещаниями bluebird? –

+1

Они взяли async lib с интеграцией обещаний bluebird. Я нашел [это] (https://www.npmjs.com/package/async-bluebird), но он кажется довольно непроверенным, поэтому я не хотел его рекомендовать. Но это может быть хорошо! Вы должны проверить [npmjs] (https://www.npmjs.com/search?q=async) и посмотреть, есть ли какой-либо пакет, который вам подходит. – William

+0

Спасибо, Уильям! Я нашел лучшее решение, посмотри мое редактирование :) –