Bluebird Promise 可以在 node.js 中与 redis 一起使用吗?
Can Bluebird Promise work with redis in node.js?
这是我获取存储在 redis 中的用户 php 会话的原始代码:
var session_obj;
var key = socket.request.headers.cookie.session
session.get('PHPREDIS_SESSION:'+key,function(err,data){
if( err )
{
return console.error(err);
}
if ( !data === false)
{
session_obj = PHPUnserialize.unserializeSession(data);
}
/* ... other functions ... */
})
我想用 Promise 重写代码,但是我无法得到 data
返回:
Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(data){
return data;
}).then(function(session){
console.log(session); // this returns true, but not the session data
session_obj = PHPUnserialize.unserializeSession(session);
}).catch(function(err){
console.log(err);
})
session
仅返回布尔值 true
而不是会话数据。原来的 redis get
函数有两个参数。我假设 promise 只是返回了第一个参数,在原来的参数中是 err
。所以我尝试了
Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(err,data){
console.log(data) // return undefined
})
但它也不起作用。
有谁知道 redis 是否可以与 Promise 一起使用?
您尝试使用 Promise.resolve
是错误的,它需要一个 Promise,而 session.get
默认情况下 return 不是一个 Promise。你首先需要 promisify it. (or promisifyAll)
session.getAsync = Promise.promisify(session.get);
// OR
Promise.promisifyAll(session); //=> `session.getAsync` automatically created
// OR
Promise.promisifyAll(redis); //=> Recursively promisify all functions on entire redis
然后像使用 promise 一样使用 returns promise 的新函数,您甚至不需要用 Promise.resolve 包装它,只需这样:
session.get('PHPREDIS_SESSION:' + key).
then(function(data) {
// do something with data
}).
catch(function(err) {
// handle error with err
});
这是我获取存储在 redis 中的用户 php 会话的原始代码:
var session_obj;
var key = socket.request.headers.cookie.session
session.get('PHPREDIS_SESSION:'+key,function(err,data){
if( err )
{
return console.error(err);
}
if ( !data === false)
{
session_obj = PHPUnserialize.unserializeSession(data);
}
/* ... other functions ... */
})
我想用 Promise 重写代码,但是我无法得到 data
返回:
Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(data){
return data;
}).then(function(session){
console.log(session); // this returns true, but not the session data
session_obj = PHPUnserialize.unserializeSession(session);
}).catch(function(err){
console.log(err);
})
session
仅返回布尔值 true
而不是会话数据。原来的 redis get
函数有两个参数。我假设 promise 只是返回了第一个参数,在原来的参数中是 err
。所以我尝试了
Promise.resolve(session.get('PHPREDIS_SESSION:'+key)).then(function(err,data){
console.log(data) // return undefined
})
但它也不起作用。
有谁知道 redis 是否可以与 Promise 一起使用?
您尝试使用 Promise.resolve
是错误的,它需要一个 Promise,而 session.get
默认情况下 return 不是一个 Promise。你首先需要 promisify it. (or promisifyAll)
session.getAsync = Promise.promisify(session.get);
// OR
Promise.promisifyAll(session); //=> `session.getAsync` automatically created
// OR
Promise.promisifyAll(redis); //=> Recursively promisify all functions on entire redis
然后像使用 promise 一样使用 returns promise 的新函数,您甚至不需要用 Promise.resolve 包装它,只需这样:
session.get('PHPREDIS_SESSION:' + key).
then(function(data) {
// do something with data
}).
catch(function(err) {
// handle error with err
});