如何使用Async库进行异步操作的Promis?

时间:2016-01-25 15:11:24

标签: javascript asynchronous bluebird

GrabRedisDataByArray = Promise.promisify(function(data, callback) {
    var temp_results = [];

    async.each(data, function(result, done) {

        redis.hgetall('username:' + result, function(err, results) {

            temp_results.push(results);
            done();
        })

    }, function(err) {
        callback(temp_results)
    });

});

除了,它正在返回

Unhandled rejection (<[{"server":"9300","user_id":"31","char...>, no stack trace )

- 该对象数据只是存储在username:密钥中的一些用户信息。

我的数据检索方法是:

 GrabRedisDataByArray(data).then(function(data){
         console.log(data)                               
 });

我认为我的问题在于GrabRedisDataByArray以及它如何在主函数范围内没有返回任何内容,而只是通过第二个参数返回一些东西?如果这有道理?我只是迷失在这里并试图理解如何将异步操作返回到main函数而不是仅通过第二个参数回调返回它(我认为我的承诺无法正常工作)

编辑:这是使用Bluebird library

1 个答案:

答案 0 :(得分:4)

好吧,promisify需要节点式回调,因此当您调用callback(temp_results)时, 会传递错误参数。它必须是callback(null, temp_results)

也就是说,当你正在使用promises时,你根本不应该使用async库。只是拥抱承诺。或者如果你坚持使用async,至少要正确使用它:

var grabRedisDataByArray = Promise.promisify(function(data, callback) {
    async.map(data, function(result, done) {
        redis.hgetall('username:' + result, done);
    }, callback);
});

但是,在宣传时,你应该始终在最低级别上宣传 - 在你的情况下redis。然后你不必乱用async回调,但可以简单地使用Bluebird的Promise.map

Promise.promisifyAll(redis);
function grabRedisDataByArray(data) {
    return Promise.map(data, function(result) {
        return redis.asyncHgetall('username:' + result);
    });
}