javascript - 将嵌套的发射器变量传递到事件监听器的回调中

标签 javascript node.js session express

在下面的示例中,我需要找到一种方法将变量“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/

相关文章:

javascript - 如何直接链接到特定的 JavaScript 选项卡?

javascript - 如何在不使用按钮或 tbody 的情况下单击动态生成的表中的一行来获取 HTML 表中单元格的值

node.js - 无服务器框架 : How to add external NPM packages?

java - 我们如何使用 sessionId 取回特定的 session ?

c# - 是否可以在 C# 中遍历存储在服务器上的所有 session

PHP:为什么当我打印 session 内容时忽略前导零?

javascript - TypeScript:有没有办法扩展多个接口(interface)并合并相同的属性?

javascript - 检查各个 div 的文本并更改内容

javascript - 陷入实现嵌套数据过滤循环的困境,这可能是一种更优雅的方法吗?

node.js - 如何将 WebAssembly 与 Node.js 结合使用