Node.js 节点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) {

我正在使用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) {
        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会有这样的函数。