2016-08-23 2 views
0

외부 API에 대한 게시물 요청을 작성한 다음 게시물 요청의 응답을 기반으로 사용자 정의 클래스의 개체를 만들고 싶습니다. 요청 모듈을 사용하여 게시 요청을합니다. 콜백 함수에서 객체를 반환하기 만하면되지만 콜백이 완료되기 전에 함수가 반환하는 것처럼 보이므로 null 객체가 항상 반환됩니다. 함수가 콜백 함수를 기다리게하려면 어떻게해야합니까? 포스트 요청을요청 모듈 (Typescript)의 콜백

기능 :

if (parsedJson["status"] === "200") 

결코 참이 없습니다 :

read(id: string) { 
    request.post({ 
     headers: { 
      "content-type": "application/json" 
     }, 
     url: baseUrl + service, 
     json: { 
      "id": id 
     } 
    }, function(error: any, response: http.IncomingMessage, body: any) { 
     if (!error && response.statusCode === 200) { 
      var parsedJson = JSON.parse(JSON.stringify(body)); 
      /* tslint:disable:no-string-literal */ 
      if (parsedJson["status"] === "200") { 
       var data = parsedJson["data"]; 
       return new Dummy.Dummy(id, data["dummy"]["value"], data["dummy2"]["value"], data["dummy3"]["value"]); 
      } 
      /* tslint:enable:no-string-literal */ 
     } 
    }); 
} 

답변

0

기능은 조건이 어쨌든 때문에 null를 반환합니다. 그래서 함수의 끝으로 가면 값을 반환하지 않습니다.

당신은 코드의 행동이 줄을 ispect해야합니다 var parsedJson = JSON.parse(JSON.stringify(body));

그것은 JSON.stringify 함수 인수로 body 변수 (즉, 확실히 문자열)이있다. 문자열을 문자열로 변환하면 "문자열 객체의 문자열"을 얻을 수 있습니다. JSON.parse으로 다시 구문 분석하면 status 속성이없는 문자열 객체가 반환되므로 parsedJson["status"]은 null이됩니다.

"상태"속성에 을 입력하고 body 입력을 이중 확인해야합니다.

편집 :

return new Dummy.Dummy(... 이름 function(error: any, response: http.IncomingMessage, body: any)에서 값을 반환 말할 것이 중요하다의 read(id: string)에서 하지.

request.post은 비동기 콜백을 사용하므로 이름이없는 함수는 값을 아무데도 반환하지 않습니다.

read(id: string, callback:(any) => any) { 
    request.post({ 
     headers: { 
      "content-type": "application/json" 
     }, 
     url: baseUrl + service, 
     json: { 
      "id": id 
     } 
    }, function(error: any, response: http.IncomingMessage, body: any) { 
     if (!error && response.statusCode === 200) { 
      var parsedJson = JSON.parse(body); 
      /* tslint:disable:no-string-literal */ 
      if (parsedJson["status"] === "200") { 
       var data = parsedJson["data"]; 
       callback(Dummy.Dummy(id, data["dummy"]["value"], data["dummy2"]["value"], data["dummy3"]["value"])); 
      } 
      /* tslint:enable:no-string-literal */ 
     } 
    }); 
} 

을 또는 당신은 고급 약속의 techique 또는 비동기 흐름 제어 라이브러리를 사용할 수 있습니다 : 당신은 예를 들어 콜백 기술을 사용해야합니다.

+0

'if' 체크 안에 새로운 Dummy 객체를 로깅하려고 시도했는데, Dummy 객체를 올바르게 출력하므로'if' 내부로 들어갑니다. 또한 나는'body'를 처음에 문자열을 지정하지 않고 (당신이 제안한 이유로) 해봤지만 작동하지 않았다. (왜 그런지 모르겠다.) 그러나 stringifying 후에도 작동한다. (왜 그런지 모르겠다.) – fluffychaos

+0

'request.get'에 대한 문서를 확인했습니다. 힘을 요청하도록'json' 매개 변수를 설정하면 자동으로'응답 '본문을 JSON으로 구문 분석하므로'body [ "status"] == 사용할 수있는'var parsedJson = JSON.parse (body);'코드는 필요 없습니다. = "200"대신. 내 대답을 확인하여 몇 가지 추가 설명을 편집하십시오. – SergeyK

+0

예를 들어 주셔서 감사합니다. 실제로'read' 함수를 호출하는 함수에 Dummy 객체를 실제로 반환하는 방법에 관해서는 혼란 스럽습니다. 위에서 간단히 말해 Dummy 객체를 param으로 가져온 콜백 함수를 만든 다음 Dummy 객체를 반환합니다. 그런 다음 함수를 param으로 전달하여'read' 함수를 호출합니다. 그러나 함수는 여전히 콜백을 끝내기 전에 반환됩니다 ... – fluffychaos