将嵌套的发射器变量传递给事件侦听器的回调

时间:2017-08-17 16:50:26

标签: javascript node.js session express

在下面的例子中,我需要找出一种方法将变量'id'传递给'set'发射器的监听器。我遇到的问题是我不能通过像updateStore(req.id)这样的处理程序传递它,因为来自mongoStore的事件'update'有它自己返回的返回值'mongoId',我也需要它。 / p>

另外,我不能只引用req.id,因为不能保证它不会因为另一个请求进入app()更改值而改变。如何在启动处理程序时访问updateStore处理程序中的req.id和mongoId的值?

请注意,这个示例代码没有运行,它是一个更大的程序的精简版本。我想提供我正在努力实现的逻辑。

var self = this;
var app = express();
var mongoStore = new MongoStore({url:'/path/to/mongo'});

function updateStore(mongoId) {
    if (mongoId == req.id) {
        // do something
        self.emit('complete');
    }
}

app.get('/*', function(req,res) {
    // req.id needs to get passed to updateStore()  
    mongoStore.on('update',updateStore);

    self.on('complete', function() {
        self.removeListener('update',updateStore)
    }
});

1 个答案:

答案 0 :(得分:1)

好好了解javascript Function.prototype.bind方法

它返回给定函数的副本

  • 第一个参数是复制函数范围中的this值。
  • 下一个参数是将在复制的函数中使用的参数。

在我们的例子中,我们可以使用此方法创建updateStore函数的副本,并使用req对象的引用,包含在对象文字中作为复制的this值功能,像这样:updateStore.bind({ req: req })。这样你只需要在其中访问this.req

var self = this,
    app = express(),
    mongoStore = new MongoStore({url:'/path/to/mongo'});

function updateStore(mongoId) {
    var req = this.req;

    if (mongoId == req.id) {
        // do something
        self.emit('complete');
    }
}

app.get('/*', function(req,res) {
    var onStoreUpdated = updateStore.bind({ req: req });

    mongoStore.on('update', onStoreUpdated);

    self.on('complete', function() {
        self.removeListener('update', onStoreUpdated);
    });
});
相关问题