我有一个生成器函数,如下所示:
function *(next) {
this.redis.get('foo', function(e, r){
console.log(r)
yield next;
})
}
我在想我可以使用共同风格的编码,var r = yield this.redis.get('foo')
但显然它不起作用。这里的错误是匿名函数中不再存在“下一个”。我怎样才能访问它?
您yield
只能在生成器中使用关键字。要处理您的问题,您应该this.redis.get
返回一个承诺而不是接受回调。为此,请编写一个promisify
函数,将期望回调的函数转换为返回 Promise 的函数:
function promisify(method) {
return function() {
var args = [].slice.call(arguments);
return new Promise(function(resolve, reject) {
method.apply(null, args.concat(function(e, r) {
e ? reject(e) : resolve(r);
}));
});
};
}
然后你可以像这样使用它:
function *(next) {
var r = yield promisify(this.redis.get)('foo');
yield next;
}
或者,一些 Promise 库提供了一个promisify
函数。例如bluebird 的 Promise.promisify可以这样使用:
var Promise = require( 'bluebird' );
function *(next){
var redisGet = Promise.promisify( this.redis.get );
yield redisGet( 'foo' );
yield next;
}