如何将对象数组映射到Q promise的数组中

我似乎无法理解这一点。 我有一个职位清单,我想把它变成一系列的承诺,然后我想收集。 它不工作,positionPromises结果为空数组(例如[null,null])

var positionPromises = _.map(positions, function(position) { var newPosition = Position({ 'weight': 1 ,'ideaId': idea.id }) var promise = null Q.all([ // asynchronous sets (each does a db lookup) newPosition.setDirectionByName(position.direction) , newPosition.setSecurityByTicker(position.ticker) ]).then(function(noop) { // the position has it's data, invoke save which also returns a promise promise = Position.qCreate(newPosition) }).done() return promise console.log("NEVER GET HERE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") }) // _.map console.log(positionPromises) positionPromises.reduce(function(noop, positionPromise){ console.log('Reduce iteration') positionPromise.then(function(position) { console.log('THEN') }) }) 

我的解决scheme

从下面的答案,这是我正在… …

上述尝试中的减less意味着在将其返回到UI之前将该位置与该想法联系起来的点。 但因为我没有积累任何东西,所有作品(可能更好):

 var positionPromises = _.map(positions, function(position) { var newPosition = Position({ 'weight': 1 ,'ideaId': idea.id }) return Q.all([ newPosition.setDirectionByName(position.direction) , newPosition.setSecurityByTicker(position.ticker) ]).then(function(noop) { //newPosition.setIdea(idea) return Position.qCreate(newPosition) }) }) // _.map Q.all(positionPromises).then(function(positions){ console.log('RESULTS of POSITION Promises') idea.positions = positions res.send(idea) }) 

 var promise = null Q.all(…) return promise 

你从函数返回null 。 对promisevariables的所有赋值都是在asynchronouscallback中完成的,这将在映射函数返回后发生。

你需要做的是使用then进行链接:计算setDirectionByNamesetSecurityByTicker ,然后当两个(全部)完成qCreate一个承诺,然后产生该承诺的价值:

 var positionPromises = _.map(positions, function(position) { var newPosition = Position({ 'weight': 1, 'ideaId': idea.id }); return Q.all([ newPosition.setDirectionByName(position.direction), newPosition.setSecurityByTicker(position.ticker) ]).then(function() { return Position.qCreate(newPosition); }); }) 

当你这样做时:

 ...).then(function(noop) { // the position has it's data, invoke save which also returns a promise promise = Position.qCreate(newPosition) }); 

它不会被调用,因为它是一个asynchronous调用,所以你会得到空数组。