【问题标题】:Cannot yield next inside anonymous function无法在匿名函数中产生下一个
【发布时间】:2015-02-15 11:11:23
【问题描述】:

我有一个生成器函数,像这样:

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

我在想我可以通过使用var r = yield this.redis.get('foo') 来使用共同风格的编码,但显然它不起作用。这里的错误是匿名函数中不再存在“下一个”。如何访问它?

【问题讨论】:

  • 你没有;在你的 console.log 之后
  • 这不是问题。分号在 js 中不是强制性的
  • 如果我是你,我不会想念他们的。我会写优雅的代码。当有人指出我的代码不优雅时,我会感谢他。
  • 哈哈! ....... ^ 以上

标签: node.js koa


【解决方案1】:

您只能在生成器中使用 yield 关键字。要处理您的问题,您应该让 this.redis.get 返回一个承诺,而不是接受回调。为此,请编写一个 promisify 函数,它将期望回调的函数转换为返回承诺的函数:

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

【讨论】:

  • 在 Bluebird 示例中,redisGet 应该在启动期间被承诺并被缓存以备后用。
  • @GabrielTomitsuka 是的,在函数之外执行promifisy 总是要好得多。但在问题redisthis 的财产。我无法在函数之外获得this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多