2017-04-06 2 views
1

Ich habe eine Aktion, die ein neues Versprechen und geben einen Entschluss schafft:Generieren Sie ein paar Versprechen, ohne auf alle zu antworten?

actions: { 
    myAction(context, data) { 
     return new Promise((resolve, reject) => { 
      this.$http("/api/something").then(response => { 
       resolve(response); 
      }, error => { 
       reject(error); 
      }) 
     }) 
    } 
} 

Nun, ich habe zwei Komponenten diese Aktion aufrufen (Erzeugen von zwei neuen Promises), aber nur die zweite Funktion nach der anderen Aktion tun muss die Entschlossenheit kommt an.

firstCall: function() { 
    this.$store.dispatch("myAction"); 
} 

secondCall: function() { 
    this.$store.dispatch("myAction").then(response => { 
     //Do something after receiving new data 
    }, error => { 
     console.error("Error") 
    }) 
} 

Ist dies ein Fehler/eine schlechte Vorgehensweise, um eine Versprechung zu erzeugen, ohne auf alle ihre Entschlüsse zu antworten?

+0

Wenn Sie nichts tun müssen, müssen Sie nichts tun. Das ist nicht falsch. – deceze

+0

Sie müssen nicht in ein zusätzliches "neues Versprechen" einbinden, sondern geben nur das Ergebnis von 'this. $ Http' zurück. –

Antwort

3

Ist dies ein Fehler/eine schlechte Übung, um eine Versprechung zu erzeugen, ohne auf alle ihre Entschlüsse zu antworten?

Es ist in Ordnung nicht unbedingt Auflösungen zu verarbeiten, aber nicht verarbeiten Ablehnungen ist in der Regel eine schlechte Praxis (und in der Tat, erzeugt nun Warnungen von up-to-date-Browser und NodeJS wird in Kürze aktualisiert werden [es sei denn, es bereits wurde] seinen Prozess auf eine unbehandelte Ablehnung zu beenden).

So möchten Sie sicher sein, Sie catch Fehler:

firstCall: function() { 
    this.$store.dispatch("myAction") 
     .catch(error => /* something here */); 
} 

(secondCall ist bereits das zu tun, mit dem zweiten Argument then.)


Unrelated, sondern dass Code-Exponate das Versprechen-Kreation-Antipattern. Du brauchst kein neues Versprechen, du hast schon eins. Nur:

actions: { 
    myAction(context, data) { 
     return this.$http("/api/something"); 
    } 
} 

Das tut genau, was Ihr Code tut, aber effizienter. Selbst wenn Sie etwas in diesen then Handlern tun, die Sie für die Zwecke der Frage entfernt haben, da then ein neues Versprechen zurückgibt, würden Sie new Promise nicht benötigen.

Verwandte Themen