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) {
        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,item) {
        item.name = scope.prefix + item.name;
        ...
        ...
    });
};

有没有更好的方法将上下文传递给回调?
nodejs将上下文传递给回调的常用方法是什么?

解决方法

Node实现了ECMAScript 5,它有 Function.bind().

我认为这就是你要找的东西.

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);
        });
    });
};

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...