【问题标题】:How to pass a value to an AngularJS $http then callback如何将值传递给 AngularJS $http 然后回调
【发布时间】:2015-11-17 16:50:01
【问题描述】:

我的问题和这里的问题很相似:How to pass a value to an AngularJS $http success callback

根据 Angular.js

不推荐使用 $http 旧式承诺方法成功和错误。请改用标准 then 方法。

那么如何使用 .then 来做类似的事情呢?

我的代码在我的服务中被这样的东西分散了

fetchFromAPI: function(key) {
    return $http.jsonp(...); 
}

这是我的控制器

for (var i = 0; i < units.length; i++){
    Service.fetchFromAPI(i)
    .then(function(response) {
        console.log(i);
    }, function(response) {
        console.log(response);
    });
}

但是控制台的输出是相同的数字,因为在返回任何调用之前执行了 for 循环,我无法绕开脑袋来编写类似于 .success 示例的上述内容,所有我的尝试给我一个错误,我的控制器不是一个函数。

Jim Horng 发布的解决方案是

$http.get('/plugin/' + key + '/js').success((function(key) {
     return function(data) {
        console.log(key, data);
    }
})(key));

【问题讨论】:

    标签: javascript angularjs callback


    【解决方案1】:

    只需使用内置的angular.forEach

    angular.forEach(units, function(unit, index){
        Service.fetchFromAPI(unit)
        .then(function(response) {
            console.log(unit, response);
        }, function(response) {
            console.log(response);
        });
    }
    

    Docs

    【讨论】:

    • 我的问题不是迭代数组中的对象,而是使用回调函数中的索引,但这可能还不清楚。
    • 阅读完 maxdec 的链接后,我意识到 angular.forEach 提供了必要的外壳来完成这项工作。它确实会提供更简洁的代码。
    【解决方案2】:

    一个快速的解决方案可能是:

    for (var i = 0; i < units.length; i++){
      Service.fetchFromAPI(i)
      .then((function(key) {
        return function (response) {
          console.log(key, response);
        };
      })(i), function(response) {
        console.log(response);
      });
    }
    

    【讨论】:

    • 这似乎解决了问题。我认为我的问题是 .then() 中缺少返回。这个返回是否会与链式冲突?
    • @CarstenFarving:问题与 for 循环内的闭包有关。这里有一个非常好的和广泛的解释:stackoverflow.com/questions/750486/…
    猜你喜欢
    • 2013-10-07
    • 2012-08-21
    • 1970-01-01
    • 2015-08-31
    • 2017-01-26
    • 2015-12-06
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多