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上,它如何不返回主函数范围中的任何内容,而仅通过其第二个参数返回什么?那有道理吗?我在这里有点迷失,试图了解如何将异步操作返回给主函数,而不是仅通过第二个参数回调返回(我认为我的诺言无法正常工作)

编辑:这是使用Bluebird library

最佳答案

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



也就是说,在使用Promise时,您根本不应使用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);
    });
}

关于javascript - 我如何使用异步库来实现异步操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34995863/

10-11 23:05
查看更多