2016-08-20 44 views
-1

我需要覆蓋從庫到單線程應用程序的一些回調函數。我多次調用方法homerSendJsonMessage,重要的是要逐一完成。總是等待前一個。這就像一個建設者。包裝回調到正常功能

我在庫中有回調函數 - 但是當我把它們放到我的方法中時,JavaScript一次全部執行。 (我知道爲什麼),我認爲這個例子可以解決它。但「IDE」說 - 沒有返回值..任何建議?

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

從庫

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

的IDE是正確的,可以定義該方法返回'YodaJsonMessage |錯誤「,但該函數不返回任何內容。 –

+0

我知道 - 但我怎麼解決? – TyZet

+0

'lib.homerSendJsonMessage'返回什麼?另外,JavaScript總是單線程的。 –

回答

1

當你的sendJson方法司令部正在使用異步函數異步操作完成之前,你不能返回一個值。
你可以這樣做:

(1)使用的回調:

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)返回一個承諾:

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); 
      } 
     }); 
    }); 
}