将嵌套的发射器variables传递给事件侦听器的callback函数

在下面的例子中,我需要找出一种方法将variables“id”传递给“set”发射器的侦听器。 我遇到的问题是,我不能通过像updateStore(req.id)处理程序传递它,因为从mongoStore事件“更新”有它自己的返回值“mongoId”它返回,我也需要。

另外,我不能仅仅引用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) } }); 

       

网上收集的解决方案 "将嵌套的发射器variables传递给事件侦听器的callback函数"

仔细看一下javascript Function.prototype.bind方法

它返回给定函数的副本

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

在我们的例子中,我们可以使用这个方法来创build一个updateStore函数的副本,并使用req对象的引用,将其作为该复制函数的this值包装在对象文本中,如下所示: updateStore.bind({ req: req }) 。 这样你只需要访问this.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); }); });