【问题标题】:Infinite loop when trying to make Angularjs display a promise尝试使 Angularjs 显示承诺时的无限循环
【发布时间】:2014-10-03 13:56:54
【问题描述】:

我在尝试让 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 被无限调用...知道为什么吗?

【问题讨论】:

    标签: javascript angularjs promise infinite-loop


    【解决方案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}}
    

    希望这会有所帮助。

    【讨论】:

    • 我的代码会生成哪个作用域的副作用?所以你觉得直接从视图传递消息代码和参数是不可能的?
    • $http的任何请求完成后,$rootScope.$apply()会被自动调用,见code。这将触发重新评估所有表达式。我会说这是间接的副作用:)
    • 哦,再看看你的代码,可能没有任何$http调用,但其他东西可能会触发$digest循环。
    • 好的,找到了,deferred.resolved() 也会触发$rootScope.$digest()
    • 感谢您的调查。那我会尝试另一种方式。很好地掌握了 AngularJS BTW ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多