如何改写Promise风格的Redis取值函数使其返回正确值?
Redis异步函数返回值问题
以下是两个从Redis获取键值的函数:
async function getRedisKeyAsync(key){ var value = await client.get(key); console.log('got value ' + value + ' for key ' + key + ' in redis'); return value; } async function getRedisKeyPromise(key){ client.get(key).then( (value) => { console.log('got value ' + value + ' for key ' + key + ' in redis'); return value; } ); }
两种方式都能正确从Redis中获取对应键的值,但调用时只有第一种能返回值:
var value1 = await myredis.getRedisKeyAsync(req.params.key); // 正常返回值 var value2 = await myredis.getRedisKeyPromise(req.params.key); // value2为undefined
解决方案
问题核心是getRedisKeyPromise函数没有返回Promise对象,内部then回调返回的value无法被外层的await捕获。只需修改函数,让它返回client.get(key)生成的Promise链即可:
async function getRedisKeyPromise(key){ // 返回整个Promise链,让await能捕获最终的value return client.get(key).then( (value) => { console.log('got value ' + value + ' for key ' + key + ' in redis'); return value; } ); }
修改后,getRedisKeyPromise的行为就和getRedisKeyAsync完全一致了——调用时用await可以正常获取到Redis返回的值。
内容的提问来源于stack exchange,提问作者Stubborn
相关产品推荐
相关产品推荐

