2014-09-27 6 views
6

나는 레거시 콜백 주위에 약속을 포장하기 위해 $q을 사용하고 있습니다. 그러나 기존 콜백에는 반환 할 값이 없습니다. 매개 변수없이 성공 함수를 사용합니다.반환 값이없는 AngularJS 약속 만들기

angular.module('MyModule').service('MyService', function() { 
    function initialize() { 
     var deferred = $q.defer(); 
     LegacyFactory.initialize(
      // 'void' Success Callback 
      function() { 
       deferred.resolve (/* WHAT DO I PUT HERE? */); 
      }, 
      // Error Callback 
      function (errorCode) { 
       deferred.reject(errorCode); 
      }); 
     return deferred.promise; 
    } 
}); 

나는 AngularJS와 워드 프로세서에서 resolvevoid 버전을 찾을 수 없습니다. 더미 값을 반환 할 수 있지만 클라이언트가 더미 값에 액세스 할 수 있습니다. 이로 인해 혼동이 생길 수 있습니다.

반환 값없이 AngularJS 약속을 어떻게 작성합니까?

참고 : AngularJS promise returning empty object이라는 질문은 완전히 다릅니다. 이 질문은 resolve 함수의 값을 반환합니다.

+0

'.. deferred.resolve()'로 해결됩니까? – PSL

+0

@PSL 가능합니까? 문서에서는 언급하지 않습니다. – metacubed

+1

예, 값없이 해결할 수 있습니다. 그냥 시도하고 무슨 일이 일어 나는지 볼 :) http://plnkr.co/edit/BpYqlg?p=preview – PSL

답변

10

JavaScript에는 데이터 형식이 void입니다. 대신 JavaScript는 값이 할당되지 않은 변수를 나타내는 데 사용되는 기본 유형 undefined을 사용합니다.

반환 값이없는 메서드 나 문은 undefined을 반환합니다. return 문을 사용하지 않는 함수는 undefined을 반환합니다. 함수에 전달되지 않은 인수는 undefined입니다.

여기에 일관된 동작이 나타나기를 바랍니다. undefined. 사용할 때

function foo(x) { console.log(x); } 
foo(); // will print undefined 
function zoom() {} 
console.log(zoom()); // will print undefined 

그래서 deferred.resolve() 당신은 데이터 인수의 값으로 undefined을 전달하고 있습니다.

더 구체적으로 질문에 답변하십시오.

"반환 값없이 AngularJS 약속은 어떻게 만듭니 까?"

약속에 대한 반환 값의 의도를 제공하는 JavaScript 코드를 작성합니다. 너는 이것을 쓸 것이다.

deferred.resolve(undefined); 

이렇게하면 의도 한 데이터가 없음을 알 수 있습니다.

나중에 콜백에서 데이터 인수를 정의 할 필요는 없지만 원하는 경우 할 수 있습니다.

foo().then(function(data){ 
    if(typeof data === 'undefined') { 
      // there is no data 
    } else { 
      // there is data 
    }); 

당신이 항상에 데이터를 기대하지 않는 경우, 그럼 그냥 이렇게.

foo().then(function(){ 
    // handle success 
}); 
+0

친절하고 상세한 답변!나는'undefined '의 false-y 동작이'promise'의 내부 비교 알고리즘으로 엉망이 될 것이라고 생각했다. :) – metacubed

+0

@metacubed true이지만, Angulars promise 코드는 콜백에 전달되는 데이터 값을 건드리지 않는다. . 여기 소스 코드에서 'value'가 그대로 전달 된 것을 볼 수 있습니다. https://github.com/angular/angular.js/blob/master/src/ng/q.js#L447 – cgTag