javascript - 访问外部范围

标签 javascript oop

我正在努力创建一个 Users 集合,该集合能够在其中获取单个用户。这将用于从另一个系统进行匹配,所以我的愿望是加载用户一次,然后能够在以后进行精细/匹配。但是,我在从内部方法访问外部用户集合时遇到问题。

function Users(){

    var allUsers;

    this.getUsers = function () {
        // ajax to that Jasmine behaves    
        $.ajax({
            url: '../app/data/jira_users.json',
            async: false,
            dataType: 'json',
            success: function(data) {
                allUsers = data;
            }
        });
        return allUsers;
    };

    this.SingleUser = function (name) {
        var rate = 0.0;
        var position;

        this.getRate = function () {
            if(position === undefined){
                console.log('>>info: getting user position to then find rate');
                this.getPosition();
            }

            $.ajax({
                url: '../app/data/rates.json',
                async: false,
                dataType: 'json',
                success: function(data) {
                    rate = data[position];
                }
            });
            return rate;
        };

        this.getPosition = function () {
            console.log(allUsers);
            //position = allUsers[name];
            return position;
        };

        //set name prop for use later I guess.
        this.name = name;
    };
}

以及开始所有这一切的测试:

it("get single user's position", function(){
    var users = new Users();
    var someone = new users.SingleUser('bgrimes');
    var position = someone.getPosition();
    expect(position).not.toBeUndefined();
    expect(position).toEqual('mgr');
});

问题是 getPosition 方法(这可能很明显),因为 allUsers 始终未定义。我这里有另一种尝试,我尝试了几种方法。我认为问题是如何开始调用 Users.getUsers,但我也不确定我使用的外部和内部变量是否正确。

最佳答案

虽然其他人是正确的,因为这不会像您输入的那样工作,但我看到用例是一个 jasmine 测试用例。因此,有一种方法可以使您的测试成功。通过执行类似以下操作,您无需实际运行任何类型的服务器来进行测试。

var dataThatYouWouldExpectFromServer = {
    bgrimes: {
        username: 'bgrimes',
        show: 'chuck',
        position: 'mgr'
    }
};

it("get single user's position", function(){
    var users = new Users();
    spyOn($, 'ajax').andCallFake(function (ajaxOptions) {
        ajaxOptions.success(dataThatYouWouldExpectFromServer);
    });
    users.getUsers();
    var someone = new users.SingleUser('bgrimes');
    var position = someone.getPosition();
    expect(position).not.toBeUndefined();
    expect(position).toEqual('mgr');
});

这将使 ajax 调用返回您希望它返回的任何内容,这也允许您模拟失败、意外数据等的测试。您可以将“dataThatYouWouldExpectFromServer”设置为任何时候你想要的任何东西.. 这可以帮助你想要测试几个不同的结果但不希望每个结果都有一个 JSON 文件的情况。

Sorta-edit - 这会修复测试用例,但可能不会修复代码。我的建议是,无论何时您依赖 ajax 调用返回,请确保您调用的方法具有“回调”参数。例如:

var users = new Users();
users.getUsers(function () {
    //continue doing stuff
});

您可以嵌套它们,或者您可以(最好)创建回调,然后将它们用作彼此的参数。

var users = new Users(), currentUser;

var showUserRate = function () {
    //show his rate
    //this won't require a callback because we know it's loaded.
    var rate = currentUser.getRate(); 
}

var usersLoaded = function () {
    //going to load up the user 'bgrimes'
    currentUser = new users.SingleUser('bgrimes');
    currentUser.getRate(showUserRate);
}

users.getUsers(usersLoaded);

关于javascript - 访问外部范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13553272/

相关文章:

javascript - i18n 用于 react 组件的数组元素

java - 代号一日历 UpdateButtonDayDate() 问题

java - 如何对调用另一个方法的方法进行单元测试?

javascript - Kurento 媒体服务器在没有音频的情况下进行录制无法正常工作

c# - 是否使用扩展方法将实现添加到反 OOP 接口(interface)?

c++ - 如何在 C++ 类模板中定义静态 constexpr 2D 数组?

c++ - 你会创建一个私有(private)类成员来消除多级函数调用吗?

javascript - 是否可以在输入表单时检查大写锁定按钮是否处于事件状态?

javascript - 检查 jquery 中的 if else 条件

javascript - 在 Map.prototype.forEach() 中获取索引