2014-10-22 2 views
1

기존 TypeScript 메서드로 작업 중이며 약속에서 errorCallback 값을 얻으려고합니다.IPromise에서 errorCallback을 가져 오는 중 문제가 발생했습니다.

public loadSavedLogin(): ng.IPromise<MyApp.Models.User> { 
    return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => { 
     if (result) { 
      this.userId = result.UserID; 
      this.userName = result.UserName; 
     } 
     return result; 
    }); 
} 

:

interface IPromise<T> { 
     then<TResult>(successCallback: (promiseValue: T) => IHttpPromise<TResult>, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>; 
     then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>; 
     then<TResult>(successCallback: (promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any): IPromise<TResult>; 

내가 전화 서비스 및 약속과 함께 일하고 있어요 TypeScript 방법은 반환 (이 작품을) 사용 인터페이스는 각도에 대한 형식 정의 파일에서 다음과 같습니다 문제는 errorCallback 값을 얻는 방법을 모른다는 것입니다. .then((result: MyApp.Models.User) 뒤에 쉼표를 넣으면 Intellisense가 errorCallback 매개 변수를 표시하는 것을 볼 수 있지만 구문을 작동시키지 못합니다. 원시 JS에서 나는 오류 값을 받아들이는 다른 함수와 함께 끝에 쉼표를 가지 겠지만,이 인터페이스로 오류를 반환하는 방법을 잘 모르겠습니다.

IPromise을 사용하여 서비스 호출이 반환하는 경우 오류 값을 얻기 위해 함수를 수정하려면 어떻게해야합니까?

+0

어떻게 작동하지 않을 때 작성합니까? errorCallback은 successCallback을 끝내는 "}"다음에 와야합니다. – Gustav

+0

@Gustav - 스티브가 의심스럽고 정확했습니다. 이전에'}'뒤에 오류 함수를 추가했을 때 오류 함수에 올바른 리턴 유형이 없었습니다. 그래서 컴파일 할 수 없었습니다. – atconway

답변

2

다음은 간단한 예제입니다. example되는 메소드의 반환 값의 형태가 ng.IPromise<string> 때문에

class Test { 
    public _test: ng.IPromise<string>; 

    // This method has a return type of ng.IPromise<string> 
    // You must return a value of this type. 
    public example(): ng.IPromise<string> { 
     return this._test.then(
      // Success 
      // Must return a string to be compatible with 
      // the ng.IPromise<string> return type 
      (val) => { 
       alert('Success'); 
       return val; 
      }, 
      // Error 
      // Should also return a string to be 
      // compatible with the return type 
      (reason) => { 
       alert('Error: ' + reason); 
       return ''; 
      }); 
    } 
} 

, 성공 기능과 then 방법의 오류 기능 경기 최대로 유형 위해 string을 반환해야합니다.

귀하의 경우에는 MyApp.Models.User의 인스턴스를 반환해야합니다.

error 함수에서 값을 반환하지 않았다고 생각하지만 성공 및 오류 함수 인 void 사이에 가장 일반적인 유형이 있습니다. 기능을 사용할 때 가장 일반적인 유형을 표시하는 단순한 배열을 사용

다른 예 ... :

var example = [ 
    (input: string) => { return 'String'; }, 
    (input: string) => { console.log(input); } 
]; 

이 예에서 사용되는 가장 일반적인 유형 (input: string) => void이다. 이상하게 보입니다. 그러나 실제로는 말이됩니다. 이 배열에서 함수를 호출하면 반환 값을 얻지 않을 것으로 예상됩니다.

그래서 성공과 오류 함수의 반환 유형이 동일하고 모든 유형이 일치해야합니다.

public loadSavedLogin(): ng.IPromise<MyApp.Models.User> { 
    return this._myAppService.getUser(this.savedUserId).then(
     (result: MyApp.Models.User) => { 
      if (result) { 
       this.userId = result.UserID; 
       this.userName = result.UserName; 
      } 
      return result; 
     }, 
     (reason: string) => { 
      return <MyApp.Models.User> null; 
     } 
    ); 
} 
+0

'당신의 실수로 당신이 가치를 되찾지 못했다고 생각합니다. '이 자리에 있었고 당신은 100 % 맞았습니다. 이전에이 구문을 시도했지만 올바른 값을 반환 했으므로 컴파일되지 않았습니다. 슈퍼 유용한 정보 및 확장 된 예를 들어 주셔서 감사합니다. 나는 그것을 훨씬 더 잘 본다. – atconway

+0

작은 문제는이 모든 _work_가 업스트림'JS' 약속이 이미 오류를 처리하는 별도의 로직을 가지고 있다는 것을 깨닫게 되었기 때문입니다. 샘플에서 작업 코드를 추가하여 필요한 다른 논리를 처리 했으므로 플로우를 방해 한 것 같습니다. 오류 객체를 반환하기 만하면 작동하지 않습니다. 본질적으로 예외를 원래 상태로 다시 던져서 업스트림 로직이 영향을받지 않도록하려면 어떻게해야합니까?(나는 여기에 질문을 함께 묶고 싶지 않다. 그래서 빠른 답이 아니라면 다른 질문을 열 수있다.) – atconway

+1

다시 던지기 위해'(reason : string) => {reason reason; }'또는'(이유 : 문자열) => {새로운 오류 (이유)를 던지십시오; }'re - throwing은 스택 추적에 영향을 줄 수 있지만. – Fenton

관련 문제