2

我是这种东西的新手,所以我想要一些设计建议。假设我有这样的事情

$(function () {
    $('#menuBtn').on('click', app.openUsersMenu);
});
var app = {
    users: null,
    openUsersMenu: function () {
        if (app.users != null) {
            //render menu
        } else {
            $.ajax({
                url: '/getUsers.json'
            }).success(function (data) {
                app.users = data;
                //render menu     
            });
        }
    }
}

这是进行延迟加载和缓存的好方法,还是您会提出更好的替代方案?避免两次编写渲染函数的有用解决方案是什么?当然你可以有类似的东西:

var app = {
    users: null,
    openUsersMenu: function() {
        if (app.users != null) {
            app.renderMenu();
        } else {
            $.ajax({
                url: '/getUsers.json'
            }).success(function (data) {
                app.users = data;
                app.renderMenu();  
            });
        }
    },
    renderMenu: function() {
        //use app.users to render
    }
}

但是随后这两个函数及其名称变得相当混乱,因此最好执行以下操作:

var app = {
    users: null,
    openUsersMenu: function () {
        if (app.users != null) {
            //render menu
        } else {
            $.ajax({
                url: '/getUsers.json'
            }).success(function (data) {
                app.users = data;
                app.openUsersMenu(); // Call itself, now with data    
            });
        }
    }
}

最后一个模式是个好主意吗?这样做的通常方法是什么?

4

1 回答 1

2

我相信你会得到很多关于不同库的建议,这些建议可以用于缓存(例如amplifyJS),并且它们有自己的位置。但是,如果您所做的只是在内存中缓存,那么您的解决方案就完美了。在幕后,这就是库无论如何都会为内存缓存做的事情——只是抽象了一点。

但是,你所拥有的很简单,很容易理解,而且最重要的是它有效。

关于加载/缓存代码的不同选项。如果永远不会直接调用 renderMenu,我会将它移到 openUsersMenu 中以使其私有:

var app = {
    users: null,
    openUsersMenu: function() {
        var renderMenu = function() {
            //use app.users to render
        };

        if (app.users != null) {
            renderMenu();
        } else {
            $.ajax({
                url: '/getUsers/json'
            }).success(function (data) {
                app.users = data;
                renderMenu();  
            });
        }
    }
}

否则,选项#2 是桃色的。Lee Meador 是对的,选项 #3 很酷,但有点难以阅读。如果您需要任何进一步的说明,请告诉我。

于 2013-01-24T17:32:56.520 回答