2016-01-24 2 views
1

im using bluebird, чтобы связать несколько связанных с фантом задач в nodejs. Моя проблема в том, что последнее в цепочке получает аргумент, переданный каждому в качестве результатов, а не результаты функции scrapDomain.bluebird обещает каждый результат возврата

Я уже возился с этим в течение 2 дней, помогите пожалуйста?

Promise цепь:

Promise 
    .each(domains, function(domain) { 
     return ensureDir(domain[0]) 
    }) 
    .each(ssHome) 
    .each(function(domain){ 
     return scrapDomain(domain).then(function(results){ 
      return results 
     }) 
    }) 
    .then(function(results){ 
      console.log(results) 
    }) 

ответ

1

См http://bluebirdjs.com/docs/api/promise.each.html

Преобразуется в исходном массиве немодифицированного, этот метод предназначен для использования побочных эффектов. Если функция итератора возвращает обещание или то, что возможно, то результат обещания ожидается, прежде чем продолжить следующую итерацию.

Я думаю, что вы хотите использовать http://bluebirdjs.com/docs/api/promise.map.html

1

Использование mapSeries который был разработан именно для этого:

Promise 
    .mapSeries(domains, function(domain) { 
     return ensureDir(domain[0]) 
    }) 
    .mapSeries(ssHome) 
    .mapSeries(scrapDomain) 
    .mapSeries(console.log); 

Хотя, лично я не стал бы писать, что код этот путь. Сначала each и mapSeries выполняют последовательно, тогда как другие функции, такие как map, выполняют функцию одновременно.

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

const scrape = Promise.coroutine(d => { // Promise.coroutine is bluebird specific 
    let dir = ensureDir(d[0]); 
    let home = yield ssHome(dir); 
    let results = yield scrapDomain(home); 
    return results; 
}); 

, а затем сделать:

let results = Promise.map(domains, scrape); 

Который позволит вам сделать:

results.then(items => console.log(items)); 
Смежные вопросы