在下面的例子中,我需要找出一种方法将变量'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)
}
});
答案 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);
});
});