2014-06-17 3 views
0

나는 여러개의 $ http.get 호출을하는 함수를 가지고있다. 모든 호출이 완료 될 때까지 함수가 대기하도록합니다. 아래 시나리오는

myApp.run(['$httpBackend','$http',function($httpBackend, $http){ 
    $http.get('data1.json').then(function(data){ 
     //do something 
    }); 
    $http.get('data2.json').then(function(data){ 
     //do something 
    }); 
    $http.get('data3.json').then(function(data){ 
     //do something 
    }); 

    //return the function only after all three .then functions are compelte 
}]); 

약속을 사용하고 있습니다. 그러나 올바른 방법으로 사용하고 있는지 확실하지 않습니다. 현재 함수 .run()은 $ http.get(). then() 호출이 완료되기 전에 반환합니다.

답변

0

내가 실행 방법에 대한 종속성으로 공장을 주입하여 내 목표를 달성 할 수 있었다. 모든 JSON 파일이 검색됩니다

공장 방법 :

myApp.factory('getJsons', ['$resource', function ($resource) { 
    var data1 = $resource('data1.json').get(); 
    var data2 = $resource('data2.json').get(); 
    var data3 = $resource('data3.json').get(); 
    return { 
     data1 : data1, 
     data2 : data2, 
     data3: data3 
    }; 
}]); 

수정 된 실행 방법 당신의 빠른 응답

myApp.run(['$httpBackend','$http', 'getJsons', 
    function($httpBackend, $http, getJsons){ 
    //do something with getJsons.data1 

    //do something with getJsons.data2 

    //do something with getJsons.data3 

    //The function is returned only after all three jsons are processed 
}]); 
2

당신은 $q를 사용하고 그들 모두를 체인 수 있습니다

myApp.run(['$httpBackend','$http', '$q', function($httpBackend, $http, $q) { 
    $q.all([ 
     (function() { 
      var d = q.defer(); 
      $http.get('data1.json').then(function(data){ 
       d.resolve(data); 
      }); 
      return d.promise; 
     })(), 
     (function() { 
      var d = q.defer(); 
      $http.get('data2.json').then(function(data){ 
       d.resolve(data); 
      }); 
      return d.promise; 
     })(), 
     (function() { 
      var d = q.defer(); 
      $http.get('data3.json').then(function(data){ 
       d.resolve(data); 
      }); 
      return d.promise; 
     })() 
    ]).then(function(responses) { 
     console.log(responses); //array of your responses 
    }); 
}]); 
+0

감사합니다. 모든 http 호출이 완료된 후에 만 ​​함수를 반환하고 싶습니다. 'maind = $ q.defer();' '$ q.all ([ '// 코드 ' '])와 같은 주 기능에 한 가지 더 약속을 추가해야합니까? 'maind.resolve (responses);' '}); 'return maind; – Srik

+0

비동기 함수에서'return'을하지 않으면 콜백을 사용합니다 – tymeJV

+0

내 문제가 해결되지 않는다고 생각합니다. 위의 코드에서 모든 http 호출이 완료된 후 "console.log (응답)"이 실행됩니다. 그러나 모든 http 호출이 완료 될 때까지 전체 기능이 대기하지 않습니다. 내 문제는이 함수에서로드 한 JSON 데이터가 다른 서비스에서 사용된다는 것이다. 이러한 서비스는이 함수의 모든 http 호출이 실행되기 전에 실행됩니다. 그래서이 기능을 종료하기 전에 모든 http 호출이 완료되었는지 확인하고 싶습니다. 이것을 달성 할 수있는 방법이 있습니까? – Srik