在下面的示例中,我需要找到一种方法将变量“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)
}
});
最佳答案
好好看看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);
});
});
关于javascript - 将嵌套的发射器变量传递到事件监听器的回调中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45740912/