gpt4 book ai didi

javascript - 如何使用 Async 库来 Promisify 异步操作?

转载 作者:行者123 更新时间:2023-11-30 09:53:52 29 4
gpt4 key购买 nike

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 函数范围内不返回任何东西,而只通过它的第二个参数返回一些东西?如果这有意义?我只是有点迷失在这里并试图了解如何将异步操作返回到主函数而不是仅通过第二个参数回调返回它(我认为我的 promise 无法正常工作)

编辑:这是使用 Bluebird library

最佳答案

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


就是说,无论如何,当您使用 promises 时,您根本不应该使用 async 库。只是拥抱 promise 。或者,如果您坚持使用 async,至少要正确地使用它:

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

但是在 promise 时,您应该始终在最低级别上 promise - 在您的例子中是 redis。然后你就不必乱用 async 回调,而可以简单地使用 Bluebird 的 Promise.map。 :

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

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com