2016-08-20 6 views
-1

ライブラリからシングルスレッドアプリケーションへのコールバック関数をカバーする必要があります。私はメソッドhomerSendJsonMessageを何回か呼びます。それを一つずつ行うことが重要です。常に前のものを待つ。それは建築家のようなものです。パッキング通常の関数へのコールバック

私はライブラリのコールバック関数を持っていますが、私のメソッドにそれらを入れると、JavaScriptは一気に実行されます。 (私は理由を知っています)、私はこの例がそれを解決できたと思います。しかし、 "IDE"と言う - 返されない値..任意のアドバイス?あなたのsendJson方法として、ライブラリ

homerSendJsonMessageToYoda(message:YodaJsonMessage, callback:((message:YodaJsonMessage, error:any)=>void)):void; 
+0

IDEは右である、あなたはメソッドが 'YodaJsonMessageを返すことを定義します。

public sendJson(request: YodaJsonMessage, cb: (result: YodaJsonMessage | Error) => void): void { lib.homerSendJsonMessage(request, (message: YodaJsonMessage, error: any) => { if (!message) { cb(error); } else { cb(message); } }); } 

(2)約束を返します。 |エラーですが、関数は何も返しません。 –

+0

私は知っていますが、どうすれば解決できますか? – TyZet

+0

'lib.homerSendJsonMessage'は何を返しますか?また、javascriptは常にシングルスレッドです。 –

答えて

1

から

public sendJson(request:YodaJsonMessage):YodaJsonMessage|Error { 
    lib.homerSendJsonMessage(request, (message:YodaJsonMessage, error:any) => { 
     if (!message) { 
      return error; 
     } else { 
      return message; 
     } 
    }); 
} 

コマンドは、非同期操作が完了する前に、あなたが値を返すことができない非同期機能を使用しています。あなたが行うことができます

は、(1)コールバックを使用します。

public sendJson(request: YodaJsonMessage): Promise<YodaJsonMessage> { 
    return new Promise((resolve, reject) => { 
     lib.homerSendJsonMessage(request, (message: YodaJsonMessage, error: any) => { 
      if (!message) { 
       reject(error); 
      } else { 
       resolve(message); 
      } 
     }); 
    }); 
} 
関連する問題