如何将一个对象数组映射到一个Q promises数组中

时间:2014-02-15 20:28:11

标签: javascript node.js promise q

我似乎无法理解这一点。我有一个职位列表,我想把它变成一系列的承诺,然后我想收集。它不起作用,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)

})

2 个答案:

答案 0 :(得分:2)

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

从函数返回nullpromise变量的所有赋值都在异步回调中完成,这将在映射函数返回后发生。

您需要做的是使用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);
    });
})

答案 1 :(得分:0)

当你这样做时:

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

它当时没有被调用,因为它是一个异步调用,所以你得到nulls数组。