1

ネストされたコールバックを簡素化するために、node-memcached API を deferred の promisify でラップしようとしています。

約束された関数を呼び出そうとすると、「TypeError:未定義のプロパティ 'namespace'を読み取れません」というメッセージが表示されます。

Memcached = require('memcached');
var memcache = new Memcached('localhost:11211');
var add = deferred.promisify(memcache.add);

add('myKey', 'myVal', 0)(function(result) {
    ...
});

node-memcached をラップしようとしたり、同じエラーが発生したりする人が他にいないようです。何がうまくいかないのかについての洞察はありますか?または、これが不完全な場合は、より良い方向へのプッシュでさえありますか?

ありがとう!

編集::

掘り下げて、今のところ最善の解決策を見つけたと答えたかっただけです。

deferred.promisify は、渡された関数のコンテキストではなく、渡された関数を独自のスコープ (this) で呼び出しているようです。

私自身の promisfy 関数を使用すると、問題が解決するようです ( http://howtonode.org/promisesからのアイデア):

function promisify(fn, context) {
    return function() {
        var def = deferred();
        var args = Array.prototype.slice.call(arguments);

        args.push(function(err, val) {
            if (err !== null) {
                return def.reject(new Error(err));
            }
            return def.resolve(val);
        });

        fn.apply(context, args);
        return def.promise;
    };
}
4

1 に答える 1

3

インスタンスのメンバーを約束するときは、次のようにこのインスタンスにバインドする必要があります。

Memcached = require('memcached');
var memcache = new Memcached('localhost:11211');
var add = deferred.promisify(memcache.add.bind( memcache ) );

add('myKey', 'myVal', 0)(function(result) {
    ...
});
于 2013-09-24T07:57:22.647 に答える