2016-02-16 60 views
1

我想使用node-redis包承諾,但我不能使用on.connect()方法。node-redis使用藍鳥promisification使用藍鳥

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

bluebird.promisifyAll(redis.RedisClient.prototype); 
bluebird.promisifyAll(redis.Multi.prototype); 

// callback version 
app.get('/redis', function(req, res) { 
    client.set("foo_rand000000000000", "some fantastic value", function(err, reply) { 
    if (err) { 
     console.log(err); 
    } else { 
     console.log(reply); 
    } 
    res.end(); 
    }); 
}); 

// promisified version 
app.get('/redis', function(req, res) { 
    return client.setAsync("foo_rand000000000000", "some fantastic value").then(function(return) { 
    console.log(return); // returns OK 
    client.quit(); 
    }); 
}); 

但我被困在下面的一個,我該如何promisify它呢?

// example 
client.on("connect", function() { 
    client.set("foo_rand000000000000", "some fantastic value", redis.print); 
    client.get("foo_rand000000000000", redis.print); 
}); 

我嘗試下面的一個,但它不工作,也看不出在命令行上的響應:

app.get('/redis', function(req, res) { 
    return client.onAsync("connect").then(function(res) { 
    console.log(res); 
    res.end(); 
    }); 
}); 

回答

2

像Freyday西亞德,on不是異步方法,但事件發射器,所以我強烈建議你從promisfying它,但是,嘿,如果你是insistant,你可以這樣做:

let _connectResolve, _connectReject, onConnected = new Promise((resolve, reject) => { 
    _connectResolve = resolve; 
    _connectReject = reject; 
}), redis = require("redis"), 
client = redis.createClient(); 

client.on('connect', _connectResolve); 

// usage example: 
onConnected.then(() => { 
    client.setAsync("foo_rand000000000000", "some fantastic value").then(redis.print); 
    client.getAsync("foo_rand000000000000").then(redis.print); 
}); 

如果您的擔心是,您必須等待客戶端連接才能獲取/設置內容,則可以將所有呼叫鏈接到onConnected諾言。例如:

app.get('/redis', (req, res) => { 
    onConnected 
    .then(() => client.setAsync("foo_rand000000000000", "some fantastic value")) 
    .then(() => res.end()); 
}); 
2

client.on()方法從EventEmitter原型未來其中redis的客戶可能繼承。你可以嘗試走原型鏈和promisify一樣好,但我可能只是處理一下我自己是這樣的:

function onConnect(client) { 
    return new Promise(function(resolve, reject) { 
    client.on('connect', function(err) { 
     if (err) return reject(err) 
     return resolve() 
    }) 
    }) 
} 

然後你就可以使用它像這樣:

app.get('/redis', function(req, res) { 
    return onConnect(client) 
    .then(function() { 
     return client.setAsync("foo_rand000000000000", "some fantastic value") 
    }) 
    .then(function(result) { 
     console.log(result); // returns OK 
     client.quit(); 
     res.end(); 
    }); 
    }); 
});