【问题标题】:Iterating variable i with deffered in angular [duplicate]角度延迟的迭代变量[重复]
【发布时间】:2014-07-14 18:33:39
【问题描述】:

我偶然发现了好几次,似乎找不到一个好的解决方案:

for (var i = types.length - 1; i >= 0; i--) {
    api.get("test").then(function(res){
        // do something with i here
        $scope.var[i] = res;
    });
};

当 then() 函数被触发时,迭代已经完成,结果只使用了 $scope.var[0],而不是 $scope.var[1]、$scope.var[2] 等。

我能想到的要么是把 i 变量作为函数的参数,然后用延迟返回它,要么使用回调,但两者都不是很好。有解决办法吗?

【问题讨论】:

    标签: javascript angularjs q deferred


    【解决方案1】:

    一种方法是将其包装在匿名函数中以强制i 绑定到迭代值:

    for (var i = types.length - 1; i >= 0; i--) {
        (function (actual_i) {
            api.get("test").then(function(res){
                // do something with i here
                $scope.var[actual_i] = res;
            });
        }(i));
    };
    

    由于您使用带有回调的 map 函数循环遍历数组,因此您可以免费绑定:

    types.map(function (value, i) {
        api.get("test").then(function(res){
            // do something with i here
            $scope.var[i] = res;
        });
    });
    

    【讨论】:

    • 用简单有效的解决方案直截了当。非常感谢!
    • 当然,“javascript 中的数组有一个 .map 函数”,至少,自 ECMA-262 第 5 版以来,它们确实如此。 Array.prototype.map() 不是 Angular 的特性。
    • 不错的表,Array.prototype.map() 仍然不是 Angular 的功能。
    • 你是对的,Angular 使用它自己的内部映射函数。
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2011-07-16
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多