无法在匿名函数内生成下一个

时间:2015-02-15 11:11:23

标签: node.js koa

我有一个生成器功能,如下所示:

function *(next) {
  this.redis.get('foo', function(e, r){
    console.log(r)
    yield next;
  })
}

我以为我可以使用var r = yield this.redis.get('foo')来使用合作风格编码,但显然它不起作用。这里的错误是匿名函数内不再存在“next”。我该如何访问它?

1 个答案:

答案 0 :(得分:1)

您只能在生成器中使用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's Promise.promisify可以像这样使用:

var Promise = require( 'bluebird' );
function *(next){
    var redisGet = Promise.promisify( this.redis.get );
    yield redisGet( 'foo' );
    yield next;
}