подождите, пока все промисы закончатся в nodejs с bluebird

Как лучше всего дождаться завершения всех обещаний в nodejs с помощью bluebird? Допустим, я хочу выбрать записи из базы данных и сохранить их в Redis. я придумал это

loadActiveChannels: function() {
    return Knex('game_channels as ch')
    .where('ch.channel_state', '>', 0)
    .then(function(channels) {
        var promises = [];
        for(var i=0; i<channels.length; i++) {
            var promise = redis.hmsetAsync("channel:"+channels[i].channel_id, _.omit(channels[i], 'channel_id'))
            promises.push[promise];
        }
        return Promise.all(promises);
    }).then(function(res) {
        console.log(res);
    })
}

Не уверен, работает ли он так, как я ожидаю. Все записи находятся в Redis, но console.log показывает пустой массив. Разве он не должен содержать массив «ОК», поскольку это сообщение, которое Redis возвращает после выполнения обещания? Что мне здесь не хватает?


person kasztelan    schedule 02.02.2014    source источник
comment
Кстати, вы можете заменить свой цикл for на .map().   -  person SLaks    schedule 02.02.2014


Ответы (1)


.map пригодится здесь:

loadActiveChannels: function() {
    return Knex('game_channels as ch')
    .where('ch.channel_state', '>', 0)
    .map(function(channel) {
        return redis.hmsetAsync("channel:"+channel.channel_id, _.omit(channel, 'channel_id'))
    }).then(function(res) {
        console.log(res);
    })
}

Причина, по которой вы не получаете никакого вывода с исходным кодом, заключается в том, что у вас есть promises.push[promise];, который должен был быть promises.push(promise).

person Esailija    schedule 04.02.2014