如何等待节点收到来自Redis的响应?

时间:2018-06-29 04:22:20

标签: node.js redis

我是node和redis的新手。我在自己的node应用程序中使用redis。 来自redis的数据以同步方式进行。这是我尝试过的。

var redis = require("redis"),
client = redis.createClient();

client.set('key',10,redis.print);

function getfn1(key){
    client.get(key,function(err,reply){
        if(err){
            console.log('Response from getfn1:-');
            console.log(err);
            return;
        }
        console.log('Response from getfn1:-');
        console.log(reply);
    });
}

async function getfn2(key){
    let response = await client.get(key);
    console.log('Response from getfn2:-');
    console.log(response);
}
console.log('1');
getfn1('key');
console.log('2');
getfn2('key');
console.log('3');

结果如下:

1
2
3
Response from getfn2:-
false
Response from getfn1:-
10

如您所见,我正在尝试在getfn2()中使用async和await等待redis的结果,但我得到的响应为'false'而不是原始响应10.如果您建议使用a等待来自redis的数据的方法。

1 个答案:

答案 0 :(得分:3)

async/await语法应与Promises一起使用,但是redis模块默认不会返回Promises。

如果您想使用Promises,这就是documentation所说的:

  

您也可以通过承诺node_redis来将诺言使用诺言   与bluebird一样:

var redis = require('redis');
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
     

它将为所有对象添加异步   node_redis函数(例如,返回client.getAsync()。then())

// We expect a value 'foo': 'bar' to be present
// So instead of writing client.get('foo', cb); you have to write:
return client.getAsync('foo').then(function(res) {
  console.log(res); // => 'bar'
});

您的getfn2函数将变为:

async function getfn2(key){
  let response = await client.getAsync(key);
  console.log('Response from getfn2:-');
  console.log(response);
}