2017-03-31 2 views
1

Ich schreibe dies, um zu wissen, ob ich es richtig verstehe oder nicht.Design-Abfrage auf die ordnungsgemäße Verwendung der "Nebenwirkung" Begriff der NGRX/Effekte

Auf Online-Beispielen gefunden, das Muster geht in der Regel wie dieses (Beispiel hier auf Add/Löschaktionen über den Zustand und auf einer Remote-Datenbank):

effects.ts:

@Effect() 
add$ = this.action$ 
    .ofType(ADD) 
    .switchMap((action: Action) => { 
    return this.http.put(...) 
     .map(response => response.json()) 
     .map(response => Observable.of({ type: ADD_SUCCESS, payload: action.payload })) 
     .catch(response => Observable.of({ type: ADD_FAIL, payload: response.status })) 

Minderer. ts

... 
switch (action.type){ 
    case 'ADD_SUCCESS': 
    ... 
    return new_state; 
    case 'ADD_FAIL': 
    return state; 
} 

Es funktioniert, aber die Geschwindigkeit der Ausführung, wie vom Benutzer gefühlt hängt davon ab, wie schnell das Netzwerk. So kam ich mit einem Muster auf, die Wetten auf der hohen Wahrscheinlichkeit, dass kein Fehler wird von der API zurückgegeben werden:

reducer.ts

... 
switch (action.type){ 
    case 'ADD': 
    ... // make the adequate addition 
    return new_state; 
    case 'ADD_FAIL': 
    ... // delete the addition previously made 
    return new_state; 
} 

effects.ts:

@Effect() 
add$ = this.action$ 
    .ofType(ADD) 
    .switchMap((action: Action) => { 
    return this.http.put(...) 
     .map(response => response.json()) 
     .catch(response => Observable.of({ type: ADD_FAIL, payload: action.payload })) 

In diesem Muster, die Aktion des Speicherns in der Datenbank ist wirklich ein "Nebeneffekt". Im unwahrscheinlichen Fall, in dem die API einen Fehler zurückgibt, wird eine zweite Aktion ausgeführt, um die erste Aktion rückgängig zu machen.

Aber ich habe diesen Entwurf noch nicht in den online gegebenen Beispielen gefunden: Da ich Amateur-Entwickler bin, frage ich mich, ob ich etwas verpasst habe, das es am Ende falsch/gefährlich/ineffizient macht.

Antwort

1

Ich würde nicht sagen, dass etwas falsch/gefährlich/ineffizient darüber ist. Alles ist subjektiv zu Ihren Programmanforderungen. Wenn Sie mit wirklich langsamen Netzwerken zu tun haben, dann muss das berücksichtigt werden.

Aber wenn in dieser Situation ein Problem schief geht, wird der Benutzer nichts darüber wissen, bis die Aktion abgeschlossen ist. Mit dem Szenario einer wirklich langsamen Netzwerk und mit beiden SUCCESS und FAIL Aktionen, dann ist der Benutzer mehr Vertrauen in die Daten, die sie haben, weil eine SUCCESS Aktion ausgelöst werden musste. Wenn Sie die Aktion SUCCESS umgehen, könnte der Benutzer arbeiten und nicht wissen, dass seine Daten falsch sind, bis die Aktion FAIL auftritt. Das Ergebnis kann geringfügig sein oder den Benutzerworkflow unterbrechen.

Nun, im Allgemeinen sollte die Zeit, die es dauert, um eine put oder post Anfrage einzureichen und eine Antwort zu erhalten, eher kurz sein. Und Ihre SUCCESS oder FAIL Aktionen sollten nicht so groß sein, dass sie eine lange Zeit für die Berechnung benötigen.

Nehmen Sie zum Beispiel ein Kassensystem. Ein Benutzer geht zur Kasse und posts zum Server. Sie möchten nicht zu einer Bestätigungsseite gelangen, bis Sie wissen, ob der Beitrag erfolgreich war oder nicht. Daher sind in dieser Situation getrennte Aktionen SUCCESS und FAIL erforderlich.

Ich denke, es bietet die beste Benutzererfahrung zu sein, sicherzustellen, dass die Daten, die sie sehen, ist genau und nicht zurückrollen Änderungen nach einem Fehler. Wenn der Benutzer posts oder puts etwas an den Server, die SUCCESS Aktion sollte dann hinzufügen, um den Anwendungsstatus und nicht vorher und auch mögliche Benutzerbenachrichtigung.Eine FAIL Aktion würde je nach Anwendung Benutzerbenachrichtigungen, potenzielle Protokollierungen usw. verarbeiten.

Ein anderes Beispiel: Sagen Sie, ein Benutzer bearbeitet ein Online-Profil. Wenn sie auf "Speichern" klicken, soll der Benutzer bei einem erfolgreichen Speichern auf dem Server benachrichtigt werden. Auf diese Weise navigieren sie nicht von der Seite weg und denken "Ich hoffe es hat gerettet, ich habe keine Antwort bekommen."

Ich würde sagen, in den meisten Szenarien ist es angemessen, sowohl eine SUCCESS und FAIL Aktionen zu haben. Aber wie gesagt, alles ist subjektiv für Ihre Anwendung und was für Ihre Benutzer in Ihrer Umgebung akzeptabel ist.

Hoffe, dass hilft.

+0

Danke Tyler für Ihre schnelle und präzise Antwort. Ich stimme den Beispielen zu, dass das klassische Design besser ist. In dem vorgeschlagenen Design und für unkritische Daten, die auf dem Spiel stehen (wie in meinem Projekt), werde ich daran arbeiten, dem Benutzer die richtige Benutzeroberfläche zu geben, damit er versteht, dass seine Aktion nicht durchgeführt wurde. – guenam

Verwandte Themen