2017-01-18 2 views
0

Es gibt einen guten Mechanismus, um Asycn-Methoden in TS zu verketten: Versprechungen. Sie können do1.then (() => ...). Catch (() => ...).Ist es in Ordnung, Maybe <T> und Ergebnis <T> Typen in Typescript/Javascript zu verwenden?

Aber was zu tun, wenn ich synchrone Methoden verketten möchte? In dieser Frage How to avoid logic duplication when promisifying js methods? war ich Ratschläge nicht zu versprechen, es zu tun.

In C# war ich glücklich, verwenden Sie vielleicht < T> und Ergebnis < T> Klassen, es zu tun. Jede Methode würde eine Klasse Ergebnis zurückgeben. Es würde Methoden haben OnSuccess (Ergebnis der Methode in es) und OnFailure übergeben (Fehler in es).

Mit Nutzung dieser Code Klassen TS aussehen würde:

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

So ist die Frage, ist es in Ordnung, diesen Ansatz zu benutzen?

Widerspricht es nicht einigen Best Practices, Prinzipien?

+1

Es ist in Ordnung, solange Sie 100% sicher sind, dass es nie einen Async-Aufruf in der Kette geben wird. Sobald es passiert, müssen Sie alles in Versprechen umwandeln. – artem

+0

Danke, Artem, ich mag deine Antwort. Ich spreche von Synchronisierung. Operationen. Hasse sie als Folge von Variablendeklarationen und Zuweisungen. –

Antwort

0

Es gibt sogar einen besseren Mechanismus, um mit asynchronen Methoden in Typoskript umzugehen: async/await. Also in Ihrem Fall, wenn Sie Ihre Root-Methode definieren zu async, können Sie einfach ‚Kette‘ zusammen synchronisieren und Asynchron-Methoden ohne zusätzliche Kopfschmerzen:

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

Beachten Sie, dass intuitiven Mechanismus der Ausnahmen nach wie vor zur Verfügung haben - Es gibt also keine Notwendigkeit, sich mit Erfolg/Ablehnungshandler anzulegen.

Hoffe, das hilft.

+0

Inmitten kann ich nicht zustimmen. Sie schlagen vor, sich auf den Try-Catch-Error-Mechanismus zu verlassen. Result.Fail() hat viel mehr Bedeutung als Fehler. Es gibt "null" Ergebnisse zurück, die erwartet und vorhergesagt werden. Die OnSuccess/OnFailure-Methode zwingt Entwickler, Situationen in der Aufrufmethode zu behandeln. Fehler in js andererseits ist wie Ausnahme in C#. Wenn Sie vergessen, damit umzugehen - Boom - Anwendung stürzt ab. Ganz anders. Und Promisifikation von Synchroneus-Operationen wurde ich vorher beraten. Obwohl ich nicht verstehe, warum ist es schlecht. Es ist eigentlich wie Ergebnis Klasse. –

+0

Diese Art von Diskussionen wird sehr schnell aus dem Rahmen der aktuellen Frage herauskommen. Bitte bedenken Sie, dass dies meine persönlichen Beobachtungen sind, die nicht als absolute Wahrheit gelten. Ich werde nur einige Dinge notieren, die Sie für nützlich halten könnten. Es gibt keinen Unterschied zwischen Entwickler vergessen zu fangen Fehler oder vergessen, OnFailure Handler zu verarbeiten - die Anwendung wird entweder abstürzen oder wird fortgesetzt, aber mit unerwarteten Ergebnissen, was besser ist, liegt an Ihnen. Auf der anderen Seite macht try/catch mit async/await das Lesen und Pflegen von Code-Levels einfacher - und reduziert so Entwicklungszeit und Fehler. – Amid

Verwandte Themen