2014-12-10 3 views
11

저는 몇 년 동안 jQuery에서 변환 한 후에 AngularJS를 배우고 있습니다. 그리고 약간의 비트는 훨씬 더 직관적입니다. 일부는별로 :).

나는 약속의 사용, 특히 $ http와 함께 사용하는 $ q에 관한 내 머리를 잡으려고 노력하고 있는데, 나는이 두 가지를 결합하여 너무 많은 정보를 찾을 수 없다.

성공/오류 콜백 대신 약속을 사용하는 이유는 무엇입니까? 둘 다 실제로 콜백을 사용하므로 약속이 더 좋은 것으로 간주되는 이유는 무엇입니까? 예 : (?) 그것이 나에게 무슨 일이 일어나고 있는지를 완벽하게 제어 할 수 있기 때문에 좋은

function get(url, success, error) { 
    success = success || function() {}; 
    error = error || function() {}; 

    $http.get(url) 
     .success(function (data) { 
      success(data); 
     }) 
     .error(function (error) { 
      error(error); 
     }); 
} 

get('http://myservice.com/JSON/', 
    function() { 
     // do something with data 
    }, 
    function() { 
     // display an error 
    } 
); 

을 다음과 같이 나는 get(...) 기능을 설정할 수 있습니다. get(...)을 호출하면 get이 호출 될 때마다 성공/오류를 제어 할 수 있습니다. 나는이 약속을 사용하여 변환하면

, 그럼 내가 얻을 :

응축
function get(url) { 
    return $http.get(url) 
     .then(function (data) { 
      return data; 
     }, 
     function (error) { 
      return error; 
     }); 
} 

get('http://myservice.com/JSON/') 
    .then(function (data) { 
     // do something with data 
    }); 
    // cannot handle my errors? 

, 동의; 우리는 명시 적으로 성공/오류 콜백에 대해 걱정할 필요가 없지만 오류를 처리하기 위해 두 번째 콜백을 구성 할 수 없기 때문에 내 오류 콜백을 처음부터 제어하지 못했던 것 같습니다.

즉, 여러 컨트롤러에서 사용할 수있는 서비스에서이 함수를 사용하면 사용자에게 오류를 알리는 UI를 업데이트 할 수 없습니다.

내가 누락 된 항목이 있습니까? 약속이 선호되는 이유가 있습니까? 나는 그 이유를 찾을 수 없다.

+1

먼저 'then'에 대한 전체 표기법은'then (successCallback, errorcallback)'입니다. 따라서 여전히 오류를 처리 할 수 ​​있습니다. 그리고'.success'와'fail'과 같은 별도의 메소드를 사용할 수 있습니다. – dfsq

+2

당신은 약속을 묶을 수 있는데, 가장 큰 장점은 – harishr

+0

입니다. @dfsq 오케이 -'http : // myservice.com/JSON /'을 호출 할 때'then'을 사용할 때 오류 콜백이 발생하지 않았습니다. 나는 다시 시도해야 할 것이다. .then (successCallback, errorCallback)는 .success (successCallback) .fail (errorCallback)과 동일합니까? – keldar

답변

23

일반적으로 콜백을 통해 Javascript에서 비동기 작업을 처리합니다.

$.get('path/to/data', function(data) { 
    console.log(data); 
}); 

잘 작동하지만 '콜백 지옥'이라고 불리는 것에 들어가면 복잡해집니다.

$.get('path/to/data', function(data) { 
    $.get('path/to/data2' + data, function(data2) { 
    $.get('path/to/data3' + data2, function(data3) { 
     manipulate(data, data2, data3); 
    }, errorCb); 
    }, errorCb); 
}, errorCb); 

다른 대안은 약속 및 추론 된 객체로 작업 중입니다. 이 의제에 대항하는

Deferreds - representing units of work 
Promises - representing data from those Deferreds 

모든 극단적 인 AsyncTask를 케이스에 당신에게 도움을 줄 수 :

  1. 당신은, 서버에서 데이터를 얻을 수를 조작하고, 범위
  2. 로 돌아갈 필요가 정기적으로 전화를
  3. 당신은 각 귀중한 일에 따라되는 다중 호출 당신은 당신이 원하는
  4. 1 개 블록에 성공을 호출하는 여러 (병렬)을 전송하고 처리하는 (cahin 전략)
  5. 이 코드가 orginized 할 당신의 작업은 쉬운 $ q를 함께 처리 할 수있는 하나의 $ HTTP

    function get(url) { 
        var deferred = $q.defer(); 
        $http.get(url) 
         .success(function (data) { 
          deferred.resolve(data); 
         }) 
         .error(function (error) { 
          deferred.reject(error); 
         }); 
    
        return deferred.promise; 
    } 
    

    입니다

그리고 서비스 함수를 호출 (컨트롤러의 처리 결과를 처리 방지하는) 같은

입니다
get('http://myservice.com/JSON/') 
.then(function (data) { 
    // do something with data 
}); 
// cannot handle my errors? 
+0

이것은 대단합니다 - 고마워요! 내'get (...) '문과 당신 문 사이의 차이점은 무엇입니까? '$ q.defer()'를 명시 적으로 사용할 때'$ http.get()'결과를 반환합니다. 내 잘못인가? – keldar

+1

deffer 객체는 호출의 래퍼이므로 $ http 호출로 생성 된 약속을 반환하지 않습니다. 여러 호출을 호출하는 경우 줄 바꿈 약속을 반환합니다. 그 약속의 기능이 시작된다. 그리고 아니, 옳고 그른 것도 없지만 최선의 가이드 라인이 아니야. @keldar –

+0

내 _chained_ 오류 콜백을 얻을 수있는 유일한 방법은 내 첫 번째 오류를 던져 버리는 것입니다. – keldar

1

당신은이 같은 오류를 처리 할 수 ​​

get('http://myservice.com/JSON/') 
    .then(function (data) { 
     // do something with data 
    }, 
    function (error) { 
     //do something with error 
    }); 

하지만 이미 다음 최종 오류가 트리거되지 않습니다 오류를 잡은 불행하게도 때문이다. 당신은 또한 성공에 동일한 문제가있을 것입니다.

$ q를 (를) 사용하기 위해 ned가 작동하도록하려면.

function get(url) { 
    var deferred = $q.defer(); 

    $http.get(url) 
     .success(function (data) { 
      deferred.resolve(data); 
     }) 
     .error(function (error) { 
      deferred.reject(error); 
     }); 

    return deferred.promise; 
} 

또한 약속을 사용할 수 있으므로 성공 및 오류 기능을 전달할 필요가 없습니다.

+1

'return error'가 작업을 수행하지 않기 때문에'get' 함수가'throw' 할 때''throw' 할 필요가 있습니다. –

+0

그 이유는 나를 위해 작동하지 않는 이유를 설명 할 수 있습니다 - 나는 당신이 오류 콜백에 다른 오류를 던질 것이라고 가정하고 체인 된 다음 자신의 콜백에 오류가 나타납니다? – keldar