Gibt es eine bessere Möglichkeit, einfach alle Fehler hier abzufangen oder da es in dieser Versprechenskette mehrere Ebenen mit mehreren Anfragen gibt, habe ich keine anderen Möglichkeiten?Behandle ich diese Versprechen richtig?
Antwort
Von einem kurzen Blick sollten Sie in der Lage sein, die Verschachtelung ganz wie folgt zu entfernen. Beachten Sie, dass im Falle eines Fehlers die Nachricht Request for block-range data failed.
immer Ihrem Code entspricht. Der Grund ist, dass die Verwendung einer $q.reject()
nur die Ausführung der Versprechungskette bis zum nächsten Handler überspringt. Wenn Sie einen solchen Handler am Ende Ihres Codes platzieren, werden alle Fehler hier abgefangen.
return RequesterService.get('peakBlockIndex', request)
.then(function(res) {
rangeData = res.data;
rangeData.intervals = [];
if (!rangeData.intervals || rangeData.intervals <= 0) {
return $q.reject({ message: 'Request returned no interval data.' });
}
return SiteService.getSite(rangeData.site.id)
})
.then(function(site) {
if (!site.zoneId) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
return getDayAheadData(site.zoneId, start, end);
})
.then(function(data) {
return handleBlockRange(rangeData, data[0].data, data[1].data);
})
.catch(function(err){
return $q.reject({ message: 'Request for block-range data failed.' });
});
Mit der neueren async
/await
Syntax kann man die Lesbarkeit verbessern. Diesmal wird die tatsächlich übereinstimmende Fehlermeldung zurückgegeben. (Beachten Sie, dass auch die spezifischen Fehlermeldungen mit der oberen Syntax zurückgegeben werden können).
async function someRequest(request){
let res;
try{
res = await RequesterService.get('peakBlockIndex', request);
} catch(e){
return $q.reject({ message: 'Request for block-range data failed.' });
}
rangeData = res.data;
rangeData.intervals = [];
if (!rangeData.intervals || rangeData.intervals <= 0) {
return $q.reject({ message: 'Request returned no interval data.' });
}
let site;
try {
site = await SiteService.getSite(rangeData.site.id);
} catch(e) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
if (!site.zoneId) {
return $q.reject({ message: 'Request for zoneId failed for the given site.' });
}
let data;
try{
data = getDayAheadData(site.zoneId, start, end);
} catch(e){
return $q.reject({ message: 'Request for cleared & forecasted data failed for the given site.' });
}
return handleBlockRange(rangeData, data[0].data, data[1].data);
}
Ja, ich verstehe jetzt total. Danke für dieses großartige Beispiel. Immer noch meinen Kopf um Versprechen, aber das hilft wirklich. – shwnrgr
- 1. Wie behandle ich Ausnahmen in Konstruktoren richtig?
- 2. Wie behandle ich Generika?
- 3. Versprechen funktioniert nicht richtig
- 4. javascript: Wie schleife ich diese Funktion richtig?
- 5. Wie schließe ich diese Schleife richtig ab?
- 6. mySQL Wie sortiere ich diese Daten richtig?
- 7. Warum erhalte ich diese Ausnahme nicht richtig?
- 8. Wie formatiere ich diese Tabelle richtig?
- 9. Wie behandle ich Ausnahmen mit Django objects.bulk_create()
- 10. Ist diese Schleifeninvariante richtig?
- 11. Wie diese latenten Stil Versprechen ES6 Stil Versprechen
- 12. Behandle einen JNI-Absturz
- 13. Wie behandle ich Disabled JS auf Browser
- 14. Wie mache ich diese Funktion zu einem Versprechen?
- 15. müssen diese Implementierung aktualisieren mit Versprechen Verkettungs
- 16. Wie UnitTest diese Methode richtig?
- 17. Eclipse CDT - Behandle 'char' als unsigned
- 18. Behandle wiederkehrende Zahlungen mit Paypal
- 19. Wie kann ich diese SQL-Abfrage richtig schreiben?
- 20. Wie sortiere ich diese Art von Array richtig?
- 21. Wie mache ich diese Animation richtig mit jQuery
- 22. Wie kann ich richtig auf diese Regierungs-API zugreifen?
- 23. Wie kann ich diese Art von Schleife richtig machen?
- 24. Express.js Behandle nicht-route Routen
- 25. ASP.Net MVC - Behandle mehrere Checkboxen
- 26. Behandle verschiedene Benutzertypen mit Hibernate
- 27. Javac: Behandle Warnungen als Fehler
- 28. Behandle große Bilder in iOS
- 29. Behandle Binärdateien als hexadezimale Zeichenfolge
- 30. Behandle .net Ausnahmen auf Anwendungsebene
Eigentlich ist diese Verschachtelung nicht notwendig. Irgendein besonderer Grund dafür? – Sirko
Ich stimme für das Schließen dieser Frage als Off-Topic ab, weil es um eine Code-Überprüfung geht (und diese somit zu breit/meinungsbasiert). Es könnte wahrscheinlich angepasst werden, um für [das Code Review Stackexchange] (http://codereview.stackexchange.com/help/on-topic) Thema zu sein. – Quentin
@Sirko ja eigentlich brauche ich Daten von der ersten Anfrage erhalten, um die zweite, und von der zweiten, um die dritte zu machen. – shwnrgr