javascript - 对 Javascript 闭包案例感到困惑

标签 javascript mongodb node.js closures

我正在使用 node-mongodb 驱动程序编写一些 node.js 代码。当我像这样获取集合对象时,我决定缓存它们:

var db = connectionObject;

function getCollection(collectionName) {
    return function(callback) {
        var cache;

        if (cache) return callback(null, cache);

        db.collection(collectionName, function(err, collection) {
            return err ? callback(err) : callback(null, cache = collection);
        });
    }
}

var usersCollection = getCollection('users');
usersCollection(function(err, collection) {
    collection.find({}); // Rest of code here ...
});

重复调用 usersCollection 函数应该使用缓存的集合对象,除非它没有——缓存变量总是未定义的。将代码更改为此可以解决问题:

return function(callback) {
    var cache = arguments.callee;

    if (cache.cached) return callback(null, cache.cached);

    db.collection(collectionName, function(err, collection) {
        return err ? callback(err) : callback(null, cache.cached = collection);
    });
}

我仍然对为什么“缓存”变量超出范围感到困惑。我做错了什么?

最佳答案

我想你想要这个:

function getCollection(collectionName) {
    var cache;
    return function(callback) {

而不是你现在拥有的:

function getCollection(collectionName) {
    return function(callback) {
        var cache;

关于javascript - 对 Javascript 闭包案例感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248978/

相关文章:

javascript - 从仅 3 个变量随机添加类到超过 20 个 div 元素

node.js - 如何自动测试 npm 包的用户版本而不是在持续集成上运行开发版本?

mongodb - 如何在 MongoDb 中简单地执行更新/替换多个文档操作

javascript - 登录 Gmail 失败,原因不明

node.js - 未找到 id 的 Stripe token

javascript - 组件在更新时消失

javascript - 如何在 React 中实现 Cloudinary Upload Widget?

javascript - 图像顶部的响应式文本叠加

mongodb - 过滤字段不存在的子文档

ruby-on-rails - Node.js 和 Rails 应用程序托管,具有共享 MongoDB 数据库和定价