Angular 控制器不等待服务承诺解决

Angular Controller Not Waiting for Service Promise to Resolve

我有一个 Angular 服务,如下所示:

(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;
    }
}

})();

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

但是,doesUserHaveFeature 方法是在 activate 方法中的 promise 被 resolved 之前调用的。因此,用户变量仍然是一个空对象。

如何确保在调用doesUserHaveFeature方法之前返回activate方法中的promise?

谢谢! 杰里米

由于 user 数据是异步检索的,您的工厂方法将不得不 return 承诺。这是我的做法...

.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();
                });
            });
        }
    };
});