getAsync函数在其他函数执行完毕后完成执行。是应该先完成然后再去另一个?怎么了?我该如何解决这个问题?
function checkRedis() {
return new Promise(resolve => {
redis.set('kleberIsTheBest', 'heSureIs')
.then(() => {
console.log('1')
redis.getAsync('bananas').then(data => {
if(!data){
console.log('I got here bb')
resolve('DOWN')
}
console.log(`here is the ${data}`)
})
})
.then((x) => {
console.log('2 ' + x)
redis.del('kleberIsTheBest')
console.log('i got here too bb')
resolve('UP')
})
.catch(() => {
console.log('uh oh... something went bad!')
resolve('DOWN')
})
})
}
另一方面,渔获量是否有效?无法模拟错误进入catch处理程序。
答案 0 :(得分:0)
好的,伙计们。我得到了答案。
对于任何想知道的人,我所要做的就是返回redis getAsync承诺,现在它的工作就像一个魅力!
function checkRedis() {
return new Promise(resolve => {
redis.set('kleberIsTheBest', 'heSureIs')
.then(() => {
return redis.getAsync('kleberIsTheBest')
})
.then(data => {
console.log(`here is the ${data}`)
if(!data){
resolve('DOWN')
}
})
.then((x) => {
redis.del('kleberIsTheBest')
resolve('UP')
})
.catch(() => {
console.log('uh oh... something went bad!')
resolve('DOWN')
})
})
}
答案 1 :(得分:-1)
目前尚不清楚您使用的是哪个Redis客户端;但是,如果您使用node_redis(节点的recommended client),则set()
不会返回承诺。 set()
功能需要回调。
如果您使用promises,则可以将bluebird与 node_redis 一起使用。使用 bluebird 宣传 node_redis 会添加带有异步后缀的函数;因此对于set()
函数,将有一个名为setAsync()
。
以下是使用 node_redis 的两种方法:
var redis = require('redis');
var client = redis.createClient();
function checkRedis(callback) {
client.set('kleberIsTheBest', 'heSureIs', callback);
};
checkRedis(function(error, result) {
if (error) {
console.error(error);
} else {
console.log('Done');
console.log(result);
}
});
var redis = require('redis');
var bluebird = require('bluebird');
bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);
var client = redis.createClient();
function checkRedis() {
return client.setAsync('kleberIsTheBest', 'heSureIs');
}
checkRedis()
.then(function(result) {
console.log('Done');
console.log(result);
})
.catch(function(error) {
console.error(error);
});