$ q.all in angular-ui模态控制器在连续打开/关闭后提前解析

时间:2015-10-01 18:16:43

标签: angularjs angularjs-q

我目前有一个模态(Angular-UI模态),当它第一次打开时,效果很好。然而,在我关闭它然后重新打开它之后,事情开始变得有些奇怪。

代码:

(function () {
    'use strict';

    angular.module('app.modals').controller('personalizeNewsSubscriptionsModalCtrl', ['$scope', '$log', '$modalInstance', '$q', 'termStoreSvc', 'userNewsSubscriptionsSvc',
            function ($scope, $log, $modalInstance, $q, termStore, userSub) {
                //#region Variable declaration
                var allTopics = [],
                    userSubs = [],
                    subscriptions = new termStore('Manaaged Metadata Service', 'TS Today', 'Topic'),
                    userSubscriptions = new userSub('blackba');

                var allSubsLoaded = subscriptions.ready(function () {
                        allTopics = subscriptions.terms;
                    }),
                    userSubsLoaded = userSubscriptions.ready(function () {
                        userSubs = userSubscriptions.subscriptions;
                    });

                $log = $log.getInstance('app.modals.personalizeNewsSubscriptionsModalCtrl');
                //#endregion                

                $q.all([allSubsLoaded, userSubsLoaded]).then(function () {
                    // use allTopics and userSubs to create $scope.subscriptions
                    $scope.subscriptions = allTopics.map(function (obj) {
                        return {
                            Title: obj,
                            Selected: userSubs.indexOf(obj) !== -1
                        }
                    });
                    $log.debug('Subscriptions object loaded', $scope.subscriptions);
                });

                subscriptions.init();
                userSubscriptions.init();                

                $scope.close = function () {
                    $modalInstance.dismiss('cancel');
                }
            }]);
})();

allSubsLoadeduserSubsLoaded对象是承诺。要了解如何解决这些问题,请参阅我的服务的简化版

(function () {
    'use strict';

    angular.module('app.services.sharepoint')
        .factory('termStoreSvc', ['$log', '$q', function ($log, $q) {
            var self = undefined,
                deferred = $q.defer(),
                promise = deferred.promise;

            var termStoreSvc = function () {                
                self = this;

                self.init = init;
                self.ready = function (fn) {
                    return promise.then(fn);
                }
            };            

            function init() {
                $log.debug('Initializing');

                // do some stuff here                

                $log.debug('Initialized');
                deferred.resolve();
            };


            return termStoreSvc;
        }]);
})();

当我调用init时,它执行一些操作然后解析我声明的隐藏的承诺,然后当ready()与回调函数一起使用时,回调不会执行直到init()方法已经完成。

出于某种原因,在我第一次打开/关闭它并打开第二个/第三个/等等时间之后,$q.all({array of promises})就会提前解决。有什么想法吗?

解决方案的代码示例:

问题是我在工厂返回的对象上没有承诺和延期对象,这意味着它们被保留(所以在第一次它们仍然显示为已解决后,导致我{ {1}}完成"早期")。

$q.all()

2 个答案:

答案 0 :(得分:1)

嗯,我看到它的方式,工厂意味着返回对象,可能有作为属性的功能,我从来没有做过工厂的新实例(新的termStore事物)。就像你在第一次已经解决的内存堆栈上放了一个承诺。单身人士模式可能会干扰你的意图。

答案 1 :(得分:1)

Angular工厂是一个单身人士。在工厂定义中声明的任何内容都将在程序的生命周期中实例化一次。当然,每当你new一个实例时,在工厂返回的对象中声明的任何东西都会被实例化。 在您的情况下,在工厂定义中声明了promise,工厂的每个实例都创建了相同promise的引用。因此,除了第一个实例之外,你的承诺已经解决了。