4

bluebirdを使用してnodejsですべての約束が完了するのを待つ最良の方法は何ですか? データベースからレコードを選択し、それらを 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が返すメッセージであるため、「OK」の配列を含めるべきではありませんか? ここで何が欠けていますか?

4

1 に答える 1

3

.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)

于 2014-02-04T05:55:22.163 に答える