尝试使Angularjs显示承诺时的无限循环

时间:2014-08-10 17:50:45

标签: javascript angularjs promise infinite-loop

我试图让AngularJS显示一个承诺时面临无限循环,如本文所述:http://markdalgleish.com/2013/06/using-promises-in-angularjs-views/

我先拨打$parseProvider.unwrapPromises(true);

.config(["$parseProvider",
function($parseProvider) {
    $parseProvider.unwrapPromises(true);
}])

这是我用来访问消息的工厂:

app.factory("MessageHelper", [
function() {

    // omitted for brevity:
    // calling the server for getting the messages

    return {

        get: function(code) {
            var args = Array.prototype.slice.call(arguments);
            args.shift();
            if (messages) {
                return $q.when(format(messages[code], args));
            }
            var deferred = $q.defer();
            deferredMessages.push({ code: code, args: args, deferred: deferred });
            return deferred.promise;
        }

    };

}]);

然后,在控制器中:

$scope.msg = {
    get: function() {
        return MessageHelper.get.apply(this, arguments);
    }
};

最后,在一个视图中:

<span>{{msg.get("existing.message.code", "first param", "second param")}}</span>

这是无限循环:$scope.msg.get被无限调用......任何想法为什么?

1 个答案:

答案 0 :(得分:1)

你不能在任何角度表达式中有任何副作用,否则会发生无限循环。

按照设计重复运行所有表达式,直到没有任何改变。所以在解析promise时,表达式将再次被评估。

为避免这种情况,您可以将msg.get调用移动到控制器中,并将承诺存储为$scope中的另一个属性:

$scope.msg = {
    get: function() {
        return MessageHelper.get.apply(this, arguments);
    }
};

$scope.resultMsg = $scope.msg.get("existing.message.code", "first param", "second param");

并在模板中使用它:

{{resultMsg}}

希望这有帮助。