node.js - 等待所有 promise 在 nodejs 中用 Bluebird 完成

标签 node.js redis promise bluebird

用 bluebird 在 nodejs 中等待所有 promise 完成的最佳方法是什么?假设我想从数据库中选择记录并将它们存储在 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 显示空数组。它不应该包含一个“OK”数组,因为它是 redis 在履行 promise 后返回的消息吗?我在这里缺少什么?

最佳答案

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

关于node.js - 等待所有 promise 在 nodejs 中用 Bluebird 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21511578/

相关文章:

javascript - 在 express 中预编译 jade 模板对生产有好处吗

javascript - 在对象原型(prototype)上设置可枚举属性

redis - 运行redis-benchmark时如何使用随机数?

javascript - 异步使用 javascript Promise

node.js - 使用 Promise 递归列出目录中的所有文件,而不使用 fs.promises api

javascript - 每个循环都有 express js 的 Node

javascript - 我怎样才能要求用户打开他们的蓝牙?使用javascript

Django 临时将其他数据库结果与 ORM 合并

redis - twemproxy 可以负载平衡读取请求吗?

swift - PromiseKit 如何返回 "when(resolved)"作为 promise ?