使用deferred.promisify错误包装node-memcached

时间:2013-07-19 18:23:28

标签: node.js memcached

我试图用deferred的promisify包装node-memcached api,以简化我的嵌套回调。

当我尝试调用promisified函数时,我得到“TypeError:无法读取未定义的属性'命名空间”。

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

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

我似乎无法找到其他人试图包装node-memcached,或者遇到同样的错误。什么可能出错?或者如果不完美的话,甚至可能会向更好的方向发展?

谢谢!

EDIT ::

只是想通过做一些挖掘来找到我现在能找到的最佳解决方案。

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

1 个答案:

答案 0 :(得分:2)

当promisify实例成员时,你应该将它绑定到这个实例,如:

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

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