Angular Controller不等待服务承诺解决



我有一个看起来像这样的角度服务:

(function () {
'use strict';
var serviceId = 'currentUserService';
angular.module('app').factory(serviceId, ['common', 'datacontext', currentUserService]);
function currentUserService(common, datacontext) {
    var $q = common.$q;
    var getLogFn = common.logger.getLogFn;
    var logError = getLogFn(serviceId, "error");
    var user = {};
    var service = {
        user: user,
        doesUserHaveFeature: doesUserHaveFeature
    };
    activate();
    return service;
    function activate() {
        var promises = [getCurrentUser()];
        $q.all(promises);
    }
    function getCurrentUser() {
        var deferred = $q.defer();
        datacontext.getLoginInformation().then(function (data) {
            user = data;
            deferred.resolve(data);
        });
        return deferred.promise;
    }
    function doesUserHaveFeature(featureName) {
        debugger;
        var feature = featureName.toLowerCase();
        var result = _.filter(user.features, function(item) {
            var featureString = item.toLowerCase();
            return feature == featureString;
        });
        if (result) {
            return true;
        }
        return false;
    }
}
})();

该服务被注入我的控制器,我的控制器调用DouserHaveFeature()方法。

但是,在解析激活方法中的承诺之前,请调用DouserHaveFeature方法。因此,用户变量仍然是一个空的对象。

如何确保在调用duserhavefeature方法之前返回激活方法中的承诺?

谢谢!杰里米

当异步检索user数据时,您的工厂方法将不得不返回承诺。这就是我的方式...

.factory('currentUserService', function(datacontext) {
    var userPromise = datacontext.getLoginInformation();
    return {
        user: userPromise,
        doesUserHaveFeature: function(featureName) {
            return userPromise.then(function(user) {
                return _.some(user.features, function(feature) {
                    return feature.toLowerCase() === featureName.toLowerCase();
                });
            });
        }
    };
});

最新更新