Javascript 显示模块模式&;可变范围->;异步调用返回后未定义公共对象

Javascript 显示模块模式&;可变范围->;异步调用返回后未定义公共对象,javascript,angularjs,asynchronous,jasmine,revealing-module-pattern,Javascript,Angularjs,Asynchronous,Jasmine,Revealing Module Pattern,我有一个角度控制器,它似乎工作得很好。我可以在服务调用中记录用户变量,它包含正确的数据。但是在我的测试中,我可以控制台记录控制器并验证用户对象是否存在,但它是空的。看起来initialize确实是在本地作用域被破坏后尝试存储变量,但这非常奇怪,因为我有另一个控制器&测试以完全相同的方式编写,工作正常 我已经重复这两天了,所以如果有人有任何线索,我将不胜感激 function DetailAccountController (accountsService) { 'use strict';

我有一个角度控制器,它似乎工作得很好。我可以在服务调用中记录用户变量,它包含正确的数据。但是在我的测试中,我可以控制台记录控制器并验证用户对象是否存在,但它是空的。看起来initialize确实是在本地作用域被破坏后尝试存储变量,但这非常奇怪,因为我有另一个控制器&测试以完全相同的方式编写,工作正常

我已经重复这两天了,所以如果有人有任何线索,我将不胜感激

function DetailAccountController (accountsService) {
    'use strict';

    var user = {};

    initialize();

    return {
        user: user
    };

    /**
     * Initialize the controller,
     * & fetch detail for a single user.
     */
    function initialize () {
        // If the service is available, then fetch the user
        accountsService && accountsService.getById('').then(function (res) {
            user = res;
        });

    }
}
还有茉莉花测试:

describe('DetailAccountController', function () {
    var ctrl = require('./detail-account-controller'),
        data = [{
            "email": "fakeUser0@gmail.com",
            "voornaam": "Mr Fake0",
            "tussenvoegsel": "van0",
            "achternaam": "User0",
            "straat": "Mt Lincolnweg0",
            "huisnr": 0,
            "huisnr_toev": 0,
            "postcode": "0LW",
            "telefoonr": "0200000000",
            "mobielnr": "0680000000",
            "plaats": "Amsterdam",
            "id": "00000000"
        }],
        accountsServiceMock,
        $rootScope,
        $q;

    beforeEach(inject(function (_$q_, _$rootScope_) {
        $q = _$q_;
        $rootScope = _$rootScope_;

        accountsServiceMock = {
            getById: function () {}
        };

    }));

    it('should call the getById method at least once', function () {

        spyOn(accountsServiceMock, 'getById').and.returnValue($q.defer().promise);
        ctrl.call({}, accountsServiceMock);

        expect(accountsServiceMock.getById.calls.any()).toBe(true);
        expect(accountsServiceMock.getById.calls.count()).toBe(1);
    });

    it('should populate user data in the model', function () {
        var deferred = $q.defer();
        deferred.resolve(data);
        spyOn(accountsServiceMock, 'getById').and.returnValue(deferred.promise);

        var vm = ctrl.call({}, accountsServiceMock);
        $rootScope.$apply();

        expect(vm.user).toEqual(data);
    });
});
好奇者的最新解决方案
user=res
影响局部变量,与返回的对象无关

必须是两者之一

    accountsService && accountsService.getById('').then(function (res) {
        angular.extend(user, res);
    });


谢谢你的回答@estus。我对显示模块模式的理解是,模块函数可以访问函数范围内的变量。由于异步函数,这不起作用,对吗?是的,显示模块不是问题,这是因为在返回变量后,一个新对象被分配给
user
。单元测试是同步的,但优先级保持不变。好吧,我现在明白了。我正在覆盖整个变量引用,而不是覆盖它的属性。谢谢你的提示。
    accountsService && accountsService.getById('').then(function (res) {
        angular.extend(user, res);
    });
var obj = {
    user: {}
};

initialize();

return obj;

function initialize () {
    accountsService && accountsService.getById('').then(function (res) {
        obj.user = res;
    });

}