0

次のようなジェネレータ関数があります。

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

を使用して co スタイルのコーディングを使用できると考えてvar r = yield this.redis.get('foo')いましたが、どうやら機能しません。ここでのエラーは、無名関数内に "next" が存在しないことです。どうすればアクセスできますか?

4

1 に答える 1

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 の Promise.promisifyは次のように使用できます。

var Promise = require( 'bluebird' );
function *(next){
    var redisGet = Promise.promisify( this.redis.get );
    yield redisGet( 'foo' );
    yield next;
}
于 2015-02-15T12:14:07.240 に答える