如何使用 Async 库来 Promisify 异步操作?
How do I Promisify an Async operation, using the Async library?
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)
});
});
除了,它是 returning
Unhandled rejection (<[{"server":"9300","user_id":"31","char...>, no stack trace )
--那个对象数据只是存储在username:
键中的一些用户信息。
而我的数据检索方法是:
GrabRedisDataByArray(data).then(function(data){
console.log(data)
});
我认为我的问题是 GrabRedisDataByArray
以及它如何在主函数范围内没有 return 任何东西,而只有 return 通过它的第二个参数?如果这有意义?我只是有点迷失在这里,并试图了解如何 return 对主函数进行异步操作,而不是仅通过第二个参数回调 return 对其进行处理(我认为我的承诺是'工作正常)
编辑:这是使用 Bluebird library
好吧,promisify
需要 node-style 回调,所以当您调用 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);
});
}
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)
});
});
除了,它是 returning
Unhandled rejection (<[{"server":"9300","user_id":"31","char...>, no stack trace )
--那个对象数据只是存储在username:
键中的一些用户信息。
而我的数据检索方法是:
GrabRedisDataByArray(data).then(function(data){
console.log(data)
});
我认为我的问题是 GrabRedisDataByArray
以及它如何在主函数范围内没有 return 任何东西,而只有 return 通过它的第二个参数?如果这有意义?我只是有点迷失在这里,并试图了解如何 return 对主函数进行异步操作,而不是仅通过第二个参数回调 return 对其进行处理(我认为我的承诺是'工作正常)
编辑:这是使用 Bluebird library
好吧,promisify
需要 node-style 回调,所以当您调用 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);
});
}