2017-05-16 10 views
0

이렇게하는 것이 나쁜 방법입니까? 나는 기본적으로 약속을 맺고 있는데, 서버로부터 성공한 각각의 리턴은 새로운 정보를 얻기 위해 새로운 http.get()을 시작하지만 에러가 발생하면 더 이상 정보를 제공하지 않는다. errorCallback이 발생하면 더 이상 http.get()을 호출하지 않습니다! 그 대신 인 경우연결 http.get은 각도 서비스로 약속합니다

$http.get(...).then(function() { 
    $http.get(...).then(function(){ 
     $http.get(...).then(function(){}, function(){}), 
    function(){}); }, 
mainErrorCallback); 

이 차이를 만들 것 "$ http.get()"는 않는다 "ViewsService.loadViews을()"를

$http.get(...).then(function() { ViewsService.loadViews(); }, function(){ console.log("error"); }). 

편집 내부 : 여기 내 말은 무엇 작동처럼, 기적 .. 그것은 보이지만, 코드는 좀 깔끔한보고 정리/효율성 고체가 필요합니다 : 델라와 (

http://jsfiddle.net/4n9fao9q/6/

을 yed http 요청) : http://jsfiddle.net/4n9fao9q/26

+0

그 결과 약속과 그 블록 안에있는 호출 약속 간에는 어떤 종속 관계가 있습니까? – Kalyan

+0

그렇습니다. 요점은 체인입니다 ... 하나가 성공하면 http.get ... 다음 두 번째로 성공합니다. 둘째는 성공합니다. 그리고 네, 서버로부터의 응답을 기다려야합니다. 하지만 내 jsfiddle 예제는 그것이 기다리는 것을 보여줍니다 ... http://jsfiddle.net/4n9fao9q/2/ – Dexter

+0

$ q 서비스 사용자. $ q.all ([배열 문의]). then() – XGreen

답변

2
$http.get(...).then((res) => { 
    //res has data from first http 
    return $http.get(...); 
}).then((res) => { 
    //res has data from second http 
    return $http.get(...); 
}).then((res) => { 
    //res has data from third http 
}).catch((err) => { 
    //exploded 
}); 

나는 더 깨끗하다고 ​​생각합니다. $ http.get을 약속을 반환하는 함수로 바꿀 수 있습니다. ViewsService.loadViews()가 약속을 반환하면 사용할 수 있습니다.

의견에 질문했습니다. 당신이 ViewsService.loadViers.then을 할 수 loadViews이 옵션 중 하나와

... 
ViewsService.loadViews = function() { 
    //returns a promise 
    return $http.get(...); 
} 

OR 

ViewsService.loadViews = function() { 
    return new Promise((resolve, reject) => { 
    $http.get(...).then((result) => { 
     //whatever 
     return resolve(); 
    }) 
    }) 
    return $http.get(...); 
} 

(등)

+0

하지만 ViewsService.loadViews에는 http.get이 있지만 약속은 없습니다. 수명주기가 깨지십니까? 즉, .success() {} 내부에서 호출되는 "loadviews"내부의 http.get이 먼저 실행 된 http.get과 비동기 적입니까? – Dexter

+0

네 코드가 맞다고 생각합니다. http://jsfiddle.net/4n9fao9q/10/ 그것은 그것을 묶는 것 같습니다. – Dexter

+0

하나의 마지막 질문, 나는 첫 번째 요청이 너무 오래 걸리면 ".then"의 후속 호출을 실행하지 않는다는 것을 확인하여 $ http를 "반환"하는 이유를 확인하고 싶습니다.대신에 "$ http.get을 호출하는 것"을 얻으시겠습니까? – Dexter

1

이이 작업을 수행하는 나쁜 방법이 있나요?

  • 효율성
  • 각 요청이 차단됩니다 당신이, 다음이 이 할 수있는 매우 효율적인 방법이 아니다 다음 요청에 대한 입력으로 첫 번째 요청의 응답을 사용하지 않는

이전에 반환 될 때까지 더 나은 방법은 $.all($http.get(...),$http.get(...))

  • 스타일

(the pyramid of doom는) 어려운 중첩 호출을 읽을 수를 사용하는 것입니다. 각 호출마다 동일한 실패 응답이 있으므로 대신이 호출을 연결할 수 있습니다. 예 :

`$http.get(..).then 
($http.get(..)).then(
($http.get(..)).catch(errHander)` 
+0

흥미 롭 ... 아니, 나는 비동기를 원하지 않는다. 나는 동시성을 원한다 (나는 모든 것을 한꺼번에 내고 싶지 않다. 나는 모든 것을 순서대로로드하기를 원하기 때문에 기다리기를 바란다). # 1, 응답을 기다리고, # 1이 성공하면 # 2를 수행 한 다음 # 3 요청을 시작한 다음 # 3 요청을 기다리고, 성공하면 # 4 만 수행합니다. – Dexter