我似乎无法理解这一点。我有一个职位列表,我想把它变成一系列的承诺,然后我想收集。它不起作用,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')
})
})
从下面的答案中,这就是我的目标...
上述尝试中的减少意味着在将其返回到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)
})
答案 0 :(得分:2)
var promise = null Q.all(…) return promise
你 从函数返回null
。 promise
变量的所有赋值都在异步回调中完成,这将在映射函数返回后发生。
您需要做的是使用then
进行链接:计算setDirectionByName
和setSecurityByTicker
,然后当两个(所有)完成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);
});
})
答案 1 :(得分:0)
当你这样做时:
...).then(function(noop) {
// the position has it's data, invoke save which also returns a promise
promise = Position.qCreate(newPosition)
});
它当时没有被调用,因为它是一个异步调用,所以你得到nulls数组。