1

我试图用 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,或者遇到同样的错误。对可能出了什么问题有任何见解吗?或者,如果这是不完美的,甚至可能会朝着更好的方向推进?

谢谢!

编辑::

只是想回应一下,我现在通过挖掘找到了最好的解决方案。

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

当 promisify 实例成员时,您应该将其绑定到此实例,例如:

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 回答