2017-01-18 5 views
0

TS:約束の中でasycnメソッドを連鎖させる良い仕組みがあります。 することができます1.then(()=> ...)。catch(()=> ...)。<T>と結果<T>タイプがTypescript/Javascriptで使用できますか?

しかし、同期メソッドをチェーンしたい場合はどうすればいいですか? この質問でHow to avoid logic duplication when promisifying js methods?私はアドバイスでしたそれを行うには約束を使用しないでください。

C#では、< T>と結果< T>クラスを使用するとうれしいです。 どのメソッドでも、の結果が返されます。結果はです。メソッドOnSuccess(メソッドの結果をその中に渡す)とOnFailure(それにエラーを渡す)があります。これらのクラスのTSコードの使用に

は次のようになります。

public processAndDouble(input: number) : number { 
 
    return processData(input) 
 
     .onSuccess((processedInput)=>{ 
 
     return processedInput * 2; 
 
     }) 
 
     .onFailure((error)={ 
 
     return 0; 
 
     }) 
 
} 
 

 
public processData(input: number) : Result<number> { 
 
    if(input >= 0) 
 
    return Result.Ok(input + 1); 
 
    else 
 
    return Result.Fail("can't process negative numbers"); 
 
}

ので、質問があり、それがこの方法を使用しても大丈夫でしょうか?

いくつかのベストプラクティス、原則に矛盾していませんか?

+1

チェーン内に1つの非同期コールが存在することは100%自信がある限り、問題ありません。それが起こると、すべてを約束に変えなければなりません。 – artem

+0

ありがとう、アルテム、私はあなたの答えが好きです。私は同期について話している。オペレーション。変数宣言と割り当てのシーケンスとしてそれらを持つことを嫌う。 –

答えて

0

typescriptで非同期メソッドを扱うためのより良いメカニズムがあります:async/await。だから、余分な頭痛と同期および非同期メソッド一緒にあなたが非同期であるためにあなたのrootメソッドを定義する場合、あなたは簡単に「チェーン」することができますあなたの場合:あなたはまだあなたが利用できる例外の直感的なメカニズムを持っている

class A 
{ 
    public async processAndDouble(input: number): Promise<number> 
    { 
     try 
     { 
      //Sync method 
      let processedInput = this.processDataSync(input); 
      //Async method 
      processedInput = await this.processDataAsync(processedInput); 
      //Sync operation again 
      return processedInput * 2; 
     } 
     catch (error) 
     { 
      return 0; 
     } 
    } 

    public async processDataAsync(input: number): Promise<number> 
    { 
     if (input >= 0) 
     { 
      //Do your async operation here 
      return input + 1; 
     } 
     else 
     { 
      throw new Error("can't process negative numbers"); 
     } 
    } 

    public processDataSync(input: number): number 
    { 
     if (input >= 0) 
     { 
      return input + 1; 
     } 
     else 
     { 
      throw new Error("can't process negative numbers"); 
     } 
    } 
} 

注意 - 成功を妨げたりハンドラーを拒否する必要はありません。

これが役に立ちます。

+0

中に、私は同意できません。 try-catch-errorメカニズムに頼ることを提案します。 Result.Fail()はエラーよりもはるかに意味があります。それは待たれて予測される "ヌル"の結果を返します。 OnSuccess/OnFailureメソッドは、呼び出し元メソッドの状況を開発者に処理させます。 一方、jsのエラーは、C#の例外のようです。それを処理することを忘れた場合 - ブーム - アプリケーションがクラッシュします。全然違う。 そしてシンクロナス操作の約束私はこれまでアガストにアドバイスされていました。しかし、私はなぜそれが悪いのか分かりません。実際にはResultクラスのようです。 –

+0

この種のディスカッションは、現在の質問の範囲から非常に速くなります。絶対的な真実ではないふりをしている私の個人的な観察であることを覚えておいてください。私はあなたが役に立つと思うかもしれない事柄を書き留めます。開発者がエラーをキャッチすることを忘れたり、OnFailureハンドラを処理するのを忘れたりします。アプリケーションがクラッシュするか、予期しない結果が続くでしょう。一方、async/awaitを試してみると、コードレベルの読み込みと保守が容易になり、開発時間とエラーを減らすことができます。 – Amid

関連する問題