IT

루프에서 약속으로 변수 전달

itgroup 2023. 2. 10. 21:44
반응형

루프에서 약속으로 변수 전달

루프의 약속이 있는데 일부 스코프 변수를 약속 핸들러에 전달하는 방법을 모르겠습니다.

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

다음은 plnkr에 관한 작업 입니다.

이 솔루션을 사용해 보세요.저는 $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

반응형