我试图用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;
};
}
答案 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) {
...
});