2015-06-30 3 views
1

Я использую Blubird и Sequelize (который использует Blubird под обложками).Как переносить некоторые данные через Bluebirds .map?

Предположим, у меня есть код, подобный:

Feed.findAll() 
    .map(function (feed) { // <---- this is what I'm interested in below 
     // do some stuff here 
     return some_promise_here; 
    }) 
    .map(function (whatever) { 
     // What is the best way to access feed here? 
    }) 
    .... 

Я нашел некоторые ответы, которые намекают на возможные решения, но я не могу достаточно положить палец на нем.

Я пробовал с Promise.all(), .spread(), но мне так и не удалось заставить его работать.

ответ

2
Feed.findAll() 
    .map(function (feed) { // <---- this is what I'm interested in below 
     // do some stuff here 
     return some_promise_here.then(function(result){ 
      return { result: result, feed: feed};// return everything you need for the next promise map below. 
     }); 
    }) 
    .map(function (whatever) { 
     // here you are dealing with the mapped results from the previous .map 
     // whatever -> {result: [Object],feed:[Object]} 
    }) 
+0

Работает как очарование, спасибо! – cgf

2

Это выглядит очень похоже на How do I access previous promise results in a .then() chain?, однако вы имеете дело с .map вызова здесь и, кажется, хотят получить доступ к предыдущему результату для того же индекса обрабатываемого массива. В этом случае, не все решения действительно применяются и closure, кажется, самым простым решением:

Feed.findAll().map(function (feed) { 
    // do some stuff here 
    return some_promise_here.then(function (whatever) { 
     // access `feed` here 
    }); 
}) 

Вы можете применить explicit pass-through, а также, хотя, как указано в @ bluetoft отвечают.

+0

Я использовал закрытие раньше, но у меня была гигантская вложенная цепочка обещаний, и именно поэтому я пошел с ответом @ bluetoft. Спасибо, конечно, работает! – cgf

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