반응형
루프에서 약속으로 변수 전달
루프의 약속이 있는데 일부 스코프 변수를 약속 핸들러에 전달하는 방법을 모르겠습니다.
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r){
console.debug(i);
});
My Service는 약속을 반환하는 get 메서드를 사용하는 실제 서비스입니다.
app.factory('MyService', function($http,$q) {
return {
get : function(itemID){
var deferred = $q.defer();
$http.get('/someresturl/'+itemID).then(function(e) {
deferred.resolve(e.data);
}, function(reason) {
deferred.reject(reason);
});
return deferred.promise;
}
});
콘솔에서는 console.debug logicaly에 1, 2, 3, 4, 5가 표시되지 않습니다.그러나 5, 5, 5, 5 (슈퍼 어레이에는 5개의 요소가 있습니다)
약속 범위에서 'i' 값을 전달하여 then()에서 사용할 수 있도록 하려면 어떻게 해야 합니까?
가능합니까?
한 가지 방법은 캡처하는 것입니다.i
종료:
for(var i in superarray) {
(function(i) {
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(i);
});
})(i);
}
또 다른 방법은 다음과 같이 준비하는 것입니다.itemID
(재산으로) 되짚어지다r
:
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(r.itemID);
});
};
콜백이 실행될 때까지i
는 배열의 마지막 요소를 참조합니다.폐쇄를 사용하여 현재 값을 캡처할 수 있습니다.i
:
for (var i in superarray){
(function(j) {
MyService.get(superarray[j].externalID).then(function(r) {
console.debug(j);
});
})(i);
}
빌트인을 사용하여 코드를 약간 단순화할 수 있습니다.Array.prototype.forEach
:
superarray.forEach(function (item, index) {
MyService.get(item.externalID).then(function(r) {
console.debug(index);
});
});
인정된 해결책에 대해 코멘트만 했을 텐데, 저는 현재 충분한 평판을 얻지 못하고 있습니다.
나는 아이템을 반복하는 두 번째 해결책이ID를 r의 속성으로 되돌리는 것도 문제 없습니다.
단순한 약속 핸들러:
angular.module('myApp', []).run(['MyService', function(MyService) {
superarray = [1, 2, 3, 4, 5];
for(var i in superarray) {
MyService.get(superarray[i]).then(function(returned) {
console.log(returned.id);
});
}
}]);
My Service 반품 아이템반환된 개체의 속성인 ID:
angular.module('myApp')
.factory('MyService', function($http,$q) {
return {
get : function(itemID){
var deferred = $q.defer();
$http.get('www.google.com').then(function(e) {
var returnObject = {
'data': e.data,
'id': itemID
};
deferred.resolve(returnObject);
}, function(reason) {
deferred.resolve(reason);
});
return deferred.promise;
}
}});
이 솔루션을 사용해 보세요.저는 $q.all을 사용했고 파라미터는 어레이에 추가했습니다.효과가 있었다
for(var i in superarray){
$q.all([MyService.get(superarray[i].externalID), i]).then(function(results){
var r = results[0];
var i = results[1];
console.debug(i);
});
}
언급URL : https://stackoverflow.com/questions/17244614/passing-variable-to-promise-in-a-loop
반응형
'IT' 카테고리의 다른 글
WordPress 테마에서 jQuery를 $로 재매핑한 후 js 파일 외부에서 함수를 트리거할 수 없습니다. (0) | 2023.02.10 |
---|---|
angular 1.5에서 ui.bootstrap.modal과 함께 angular 구성 요소를 사용하는 방법 (0) | 2023.02.10 |
MVC 웹 API:요청된 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다. (0) | 2023.02.10 |
WordPress 템플릿에서 현재 페이지가 WooCommerce 카트인지 체크아웃 페이지인지 어떻게 알 수 있습니까? (0) | 2023.02.10 |
Woocommerce 3에서 프로그래밍 방식으로 주문에 요금 추가 (0) | 2023.02.10 |