Node.js 节点js将上下文传递给回调
我正在使用node.js。我有一个handlers.js文件:Node.js 节点js将上下文传递给回调,node.js,Node.js,我正在使用node.js。我有一个handlers.js文件: exports.Handlers = function(prefix) { this.prefix = prefix; this.db = new DBInstance(); }; exports.Handlers.prototype.getItemById = function(id) { var item = this.db.getItemById(id, function(error, item) {
exports.Handlers = function(prefix) {
this.prefix = prefix;
this.db = new DBInstance();
};
exports.Handlers.prototype.getItemById = function(id) {
var item = this.db.getItemById(id, function(error, item) {
item.name = this.prefix + item.name;
...
...
});
};
当我打电话时:
var h = new Handlers();
h.getItemById(5);
我收到一个错误,因为上下文不是处理程序,并且this.prefix不存在。我可以使用以下方法修复它:
exports.Handlers.prototype.getItemById = function(id) {
var scope = this;
var item = this.db.getItemById(id, function(error, item) {
item.name = scope.prefix + item.name;
...
...
});
};
有没有更好的方法将上下文传递给回调?
节点将上下文传递给回调的常用方法是什么?这是常用的方法。您将发现您的
范围变量名为self
或\u self
稍后编辑:
如果要在另一个上下文中调用函数,请使用以下方法:
getItemById.call(context, vars);
这个问题与Node.js无关,它是JavaScript中的一个常见问题——您已经找到了JavaScript中的常用解决方案:将这个上下文绑定到另一个变量(您称之为范围)中,并在回调中使用该变量访问外部上下文
此变量的常用名称包括that
和self
ECMAScript 6(代号“harmony”)中可能有一种解决方案,即所谓的fat arrow操作符,它将函数绑定到外部上下文。如果你今天想玩它,你可能想看看,一个由微软制造的JavaScript预编译器,它专注于ES6兼容的语法。然后您的回调会变成如下内容
foo(() => { console.log(this.bar); });
而不是:
var that = this;
foo(function () { console.log(that.bar); });
只是为了完整性:jQuery(和其他框架)bind
函数的工作原理通常类似。有关示例,请参见
HTH.节点实现了ECMAScript 5,它具有
我想这就是你要找的
exports.Handlers.prototype.getItemById = function(id) {
var item = this.db.getItemById(id, (function(error, item) {
item.name = this.prefix + item.name;
...
...
}).bind(this)); //bind context to function
};
但是,当使用闭包作为回调时,就像您正在做的那样,最常用的方法是将上下文存储在一个可以在闭包中使用的变量中
这种方法更常见,因为很多时候回调可能很深,对每个回调调用bind
可能很重;而定义自我
一次很容易:
SomeObject.prototype.method = function(id, cb) {
var self = this;
this.getSomething(id, function(something) {
//self is still in scope
self.getSomethingElse(something.id, function(selse) {
//self is still in scope and I didn't need to bind twice
self.gotThemAll(selse.id, cb);
});
});
};
我知道所有这些,我只是在寻找node.js的答案。。节点需要一些$.proxy或u.bind。无论如何,谢谢。没有节点的$.proxy或u.bind吗?编辑了答案。你可以在不同的上下文中调用函数。不,你错了。我需要一个返回具有正确上下文的函数。我可以自己编写这个函数,但我希望node.js会有这样的函数。