0

我正在使用express 框架使用 postgresql开发node.js应用程序。我正在尝试尽可能多地遵循 MVC。

我想在模型类中生成查询结果,然后将它们传递给控制器​​类。该控制器类实际上是在路由中定义的,因此控制器类可以获取结果并将它们作为 http 响应传递。

这是我的数据库助手类,即模型类。我的问题出在课程最后的听众身上

exports.DatabaseHelper = function()
{
    var allVenues;
    var client;
    var customEventEmitter;

    this.init = function()
    {
        this.customEventEmitter = new events.EventEmitter();


        client = new pg.Client(
        {
            host:'localhost',
            port:5432,
            database:'postgres',
            user:'postgres',
            password:'password'
        });
    }



    this.getVenuesWithEvents = function(searchParams)
    {
        allVenues = new Array();

        var query_for_venues;

        this.init();

        client.connect();   

        client.addListener("error",function()
        {
            sys.puts("postgresql interface error");
        });

        query_for_venues = client.query("select id, name, location, latitude, longitude, category_generalized from venues");


        query_for_venues.addListener("row",function(row)
        {
            //some code
        });

        query_for_venues.addListener("end",function(result)
        {
                this.customEventEmitter.emit("data",allVenues);
//////////////////////////////////////////////////////////                  
//this line shows error....'this' refers to the query object so customEventEmitter is undefined
//customEventEmitter is my idea of sharing the query results to my controller class.
//but I cannot do this becasue of this error

                console.log("after emission");
        });
    }

}

如何从侦听器中访问 c​​ustomEventEmitter 实例变量?

4

2 回答 2

1

只需this从您的 init 函数中删除:

this.customEventEmitter = new events.EventEmitter();

所以你会有:

customEventEmitter = new events.EventEmitter();

在您的听众中,只需发出发射器,无需this如下:

query_for_venues.addListener("end",function(result){
            customEventEmitter.emit("data",allVenues);

            console.log("after emission");
 });
于 2013-05-29T03:32:24.883 回答
0

让我告诉你一个很好的技巧。

你可以改变习惯

var customEventEmitter;

this.customEventEmitter =null;

在函数的顶部。然后你可以打电话

var self = this;

在查询功能之外。然后在查询函数中,您使用 self 引用外部“this”。

如:

self.customEventEmitter.emit()

我刚才描述的方法是标准的。

于 2015-05-23T17:03:39.837 回答