角度工厂店承诺结果

时间:2017-03-08 20:36:31

标签: javascript angularjs angularjs-scope factory angular-promise

我有一个包含私有对象的工厂对象,用于使用工厂可用的函数缓存从api检索的结果。

global.mainApp.factory('SessionFactory', function (UserEndpointsResource, SiteEndpointsResource) {
    var data = {
        /**
         * @type {boolean|null}
         */
        isLoggedIn: null
    };
    return {
        isUserLoggedIn: function (callback) {
            if (data.isLoggedIn != null) {
                callback(data.isLoggedIn);
            }
            else {
                UserEndpointsResource.isLoggedIn().$promise.then(function (res) {
                    var isUserLoggedIn = res.status == 1;
                    // Trying to set the result to the outer scope data variable
                    data.isLoggedIn = isUserLoggedIn;
                    callback(isUserLoggedIn);
                }, function (failureData) {
                    data.isLoggedIn = false;
                    callback(false);
                });
            }
        },
        ...
    };
});

每次调用isUserLoggedIn函数时,data.isLoggedIn的问题始终为null。

如何更改promise中的工厂数据对象呢?

感谢。

1 个答案:

答案 0 :(得分:0)

使用评论中提供的建议,即do not store promise results, store promises themselves,这是修改后的工作代码!

global.mainApp.factory('SessionFactory', function (UserEndpointsResource, SiteEndpointsResource) {
    var data = {
        /**
         * @type {boolean|null}
         */
        isLoggedIn: null
    };
    return {
        isUserLoggedIn: function (callback) {
            if (data.isLoggedIn != null) {
                data.isLoggedIn.then(function (isLoggedIn) {
                    callback(isLoggedIn.status == 1);
                });
            }
            else {
                data.isLoggedIn = UserEndpointsResource.isLoggedIn().$promise.then(function (res) {
                    var isUserLoggedIn = res.status == 1;
                    callback(isUserLoggedIn);
                    return isUserLoggedIn;
                }, function (failureData) {
                    data.isLoggedIn = false;
                    callback(false);
                    return null;
                });
            }
        }
    };
});