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になります。

「ステータス」プロパティには、JSON.parse(body)とダブルチェック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

新しいDummyオブジェクトを 'if'チェックの中でロギングしようとしましたが、Dummyオブジェクトを正しく出力するので、' if'の中に入ります。また、私はあなたが提案した理由のために最初にそれをストリングせずに 'body'をパースしようとしましたが、うまくいきませんでした(なぜか分からない)。 – fluffychaos

+0

私は 'request.get'のためにドキュメントをチェックしました。 'json'パラメータを強制的に要求するように強制する機能は、' response'ボディをJSONとして自動的に解析するため、 'var parsedJson = JSON.parse(body);'コードは必要ありません。 = "200" 'である。私の答えをチェックして、さらに詳しい説明をしてください。 – SergeyK

+0

ありがとうございます。私はまだ 'read'関数を呼び出す関数にDummyオブジェクトを実際に戻す方法については混乱しています。私は単純にDummyオブジェクトをparamとして(上記のように)取るコールバック関数を作り、Dummyオブジェクトを返します。その後、関数を 'read'関数を呼び出す関数にパラメータとして渡しました。しかし、関数はまだコールバックを終了する前に戻ります。 – fluffychaos

関連する問題