为什么我的承诺不起作用?

时间:2017-08-16 18:25:11

标签: javascript node.js asynchronous redis promise

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处理程序。

2 个答案:

答案 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);
    }
});

使用Promise

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);
});