2015-08-24 30 views
4

我的問題是頗爲相似的問題在這裏:How to pass a value to an AngularJS $http success callback

根據Angular.js

的$ HTTP遺留承諾的方法成功和錯誤已被棄用。改爲使用標準然後方法。

那麼,怎麼會和.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示例的上述內容,但是所有嘗試都給了我一個錯誤,指出我的控制器不是函數。

發表吉姆·弘的解決方案是

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

回答

5

只需使用內置angular.forEach

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

Docs

+0

我的問題是不迭代數組中的對象,而是使用回調函數中的索引,但可能不清楚。 –

+0

通過閱讀maxdec的鏈接後,我意識到angular.forEach提供了必要的外殼來完成這項工作。它確實會提供更清晰的代碼。 –

+0

@CarstenFarving upvote並接受:) –

1

一個快速的解決辦法是:

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); 
    }); 
} 
+0

這似乎解決了問題。我認爲我的問題是.then()中缺少的回報。 這個返回與鏈接衝突嗎? –

+0

@CarstenFarving:問題與for循環中的閉包有關。這裏有一個非常好的和廣泛的解釋:http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – maxdec