2017-10-08 2 views
1

die Dokumentation lesen, wie ich es in ES6 die Bedeutung verstehen:Beheben von Zusagen von ES6 Pfeil Funktionen

foo => someFun(foo); 

entspricht:

foo => { return someFun(foo); } 

Ich bin ein neues Versprechen der Rückkehr und innerhalb dieser Code mit Pfeil-Funktionen, um die Auflösung & Reject-Methoden, z

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

Als solcher ist der Code in der dann tatsächlich,

.then(data => return resolve(data)) 

Wenn ja, ist es gleichgültig, dass das Ergebnis der Entschlossenheit (von denen ich bin mir nicht sicher, ob der Typ des Wertes) und sollte ich es stattdessen etwas weniger knapp und schreiben Sie mit {}

die implizite Rückkehr zu verhindern
.then(data => { resolve(data); }) 
+0

Ein paar Kommentare haben genau gesagt, dass das innere Versprechen nicht benötigt wird. Daher bitte die ursprüngliche Frage, aber mit dem dann modifizierten ".dann (data => resolve (data.item)) ", dh einige zusätzliche (wenn auch geringfügige) Verarbeitung durchführend – const

+0

Vermeiden Sie in jedem Fall den [' Promise'-Konstruktor-Antipattern] (https://stackoverflow.com/q/23803743/1048572? Was-ist-die-Verheißung-Konstruktion-Antipattern-und-wie-vermeide-es) und nicht "Entschlossenheit"/"ablehnen" als Rückrufe zu einem Versprechen überhaupt! – Bergi

Antwort

0

Wenn Sie wollen einfach nur Daten zurückgeben, und lehnen einhüllen eines Fehlers dann brauchen Sie kein dann()

return new Promise(function(resolve, reject) 
{ 
    someFunThatReturnsAPromise() 
    .then(data => resolve(data)) 
    .catch(err => reject(err)); 
}); 

wäre gleichbedeutend mit

return someFunThatReturnsAPromise() 

, wenn Sie einige Verarbeitung auf Daten

+0

sollte es nicht be 'return new Versprechen ((reslove, reject) => {...})' – Stavm

+0

someFunThatReturnsAPromise() gibt bereits ein Versprechen zurück, warum möchten Sie es in ein anderes Versprechen einfügen? – marvel308

+0

Das ist eine gültige Frage. Im Beispielcode Vielleicht wäre das Beispiel ein bisschen besser gewesen, wenn die Zeile dann: .then (data => resolve (data.item)) sagen würde – const

0

Die resolve Funktion bereits tun wollen kehrt undefined, so dass es absolut keinen Unterschied macht, wenn Sie implizit es mit einem Rück Ein-Zeilen-Pfeil-Funktion oder nicht aus einem Funktionskörper überhaupt zurückgeben (da letzteres bedeutet, dass Ihr Funktionskörper implizit undefined selbst zurückgibt).

Darüber hinaus, da Sie das Versprechen von someFunThatReturnsAPromise() in ein neues Versprechen zurückgeschickt haben, gibt es nichts, das die Rückgabe sowieso behandelt, so würde es keinen Unterschied machen, auch wenn etwas zurückgegeben wurde.

Noch wichtiger, die Art, wie Sie ein Versprechen in ein neues Versprechen verpackt haben, ist ein Anti-Pattern. Das Konstrukt new Promise() ist nur für den Umgang mit asynchronen Prozessen gedacht, die noch nicht auf Versprechungen basieren.
Da someFunThatReturnsAPromise() bereits ein Versprechen zurückgeben, müssen Sie es nicht in ein neues einpacken, verwenden Sie einfach das, das Sie haben!
Für Ihr Beispiel, das einfach bedeuten würde, es zurückschicken:

return someFunThatReturnsAPromise() 

Wenn Sie einige Verarbeitung der Daten, wie sie nur einen Teil der Daten zurückgegeben (die status Eigenschaft im Beispiel unten) tun möchten, können Sie tun, dass in einem then Rückruf:

return someFunThatReturnsAPromise().then(data => data.status) 

Wenn Sie in einem then Rückruf zurückkehren, wird es wiederum ein neues Versprechen zurück, die Sie zurückgeschickt mit den Daten aufgelöst werden (es sei denn, Sie ein anderes Versprechen zurück, wobei in diesem Fall wird es auflösen, wenn dieses Versprechen verrechnet wird).
So können Versprechen funktionieren, indem die asynchronen Prozesse und ihre Ergebnisse verkettet werden.

+0

Das ist großartig. Ich habe aus deinem anderen Kommentar erkannt, dass das äußere Versprechen nicht benötigt wird. In meinem eigentlichen Code konnte ich eine Reihe von diesen entfernen, dies hat die Code-Größe reduziert. Es hat auch Probleme gelöst, wo das äußere Versprechen die Bindung von diesem ändert, was zu verschiedenen const self führte, die jetzt entfernt wurden. Vielen Dank! – const

Verwandte Themen