was passiert, wenn wir nicht beheben oder ablehnen, das Versprechen
Habe ich ein Szenario, wo bin ich wieder ein Versprechen.
Das Versprechen, im Grunde geben die Antwort des ajax-request.
Auf die Ablehnung der Versprechen, zeigt es eine Meldung, dass es ein server-Fehler.
Was ich will zu tun ist, wenn der response-code 401, dass ich weder auflösen wollen, die Versprechen, noch Sie abzulehnen(weil es zeigt Fehler-dialog). Ich will einfach nur umleiten auf die login-Seite.
Mein code sieht ungefähr so aus
function makeRequest(ur,params) {
return new Promise(function(resolve,reject) {
fetch(url,params)
.then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
})
}
else {
if(status === 401) {
redirectToLoginPage();
}
else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({status,error});
})
}
}
})
});
}
Wie Sie sehen können, wenn der status 401, ich bin die Umleitung auf die login-Seite. Versprechen ist weder gelöst, noch abgelehnt.
Ist dieser code OK?
Oder gibt es eine bessere Möglichkeit, dies zu erreichen.
Dank.
InformationsquelleAutor der Frage Aniket | 2016-04-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Versprechen ist nur ein Objekt mit Eigenschaften in Javascript. Es gibt keine Magie, um Sie. So andernfalls zu beheben oder ablehnen, ein Versprechen versagt, jemals ändern Sie den Status von "pending" auf etwas anderes. Dies verursacht keine grundlegende problem in Javascript, denn ein Versprechen ist ein normales Javascript-Objekt. Das Versprechen wird immer noch Müll gesammelt (auch wenn noch angemeldet), wenn kein code hält eine Referenz auf das Versprechen.
Die wirkliche Konsequenz ist hier, was bedeutet, dass der Verbraucher das Versprechen, wenn sein Zustand wird sich nie geändert? Alle
.then()
Zuhörer für die Lösung oder ablehnen übergänge wird nie aufgerufen. Die meisten code, der verwendet verspricht, erwartet Sie zu lösen oder ablehnen, irgendwann in der Zukunft (deshalb verspricht die verwendet werden, in den ersten Platz). Wenn Sie nicht, dann, der code ist in der Regel nie zu Ende seiner Arbeit.Ist es möglich, dass Sie haben könnte, einige andere Codes, die Ausführungen der arbeiten für die Aufgabe und die Verheißung wird nur aufgegeben, ohne jemals Ihr Ding macht. Es ist kein internes problem in Javascript, wenn Sie es tun, die Art und Weise, aber es ist nicht, wie Sie verspricht, die entworfen wurden, um zu arbeiten und ist in der Regel nicht, wie Sie dem Verbraucher verspricht, erwarten Sie, um zu arbeiten.
In diesem speziellen Fall, es ist alles OK und ein redirect ist ein etwas besonderer und einzigartiger Fall. Ein redirect auf eine neue browser-Seite wird komplett löschen Sie die aktuelle Seite Zustand (einschließlich alle Javascript-Zustand), so ist es völlig in Ordnung, eine Verknüpfung mit dem umleiten und lassen Sie einfach andere Dinge ungelöst. Das system wird komplett neu initialisiert Javascript-Zustand, wenn die neue Seite beginnt zu laden, damit alle Versprechungen, die noch anhängig waren, werden bereinigt.
InformationsquelleAutor der Antwort jfriend00
Immer beheben oder ablehnen Versprechen. Auch wenn Sie nicht mit dem Ergebnis jetzt, trotz dieser arbeiten, es ist eine sehr schlechte Praxis, um in zu erhalten, weil Versprechungen Liebe zu schlucken Fehler, und je komplexer dein code wird, desto schwieriger wird es sein, zu finden, die wenigen Orte, wo Sie nicht explizit komplett ein Versprechen (plus Sie werden nicht einmal wissen, ob das das problem ist).
InformationsquelleAutor der Antwort kungphu
Ich denke, die "was passiert, wenn wir nicht beheben ablehnen" beantwortet worden ist fein - es ist Ihre Wahl, ob Sie eine
.then
oder eine.catch
.Jedoch Ist dieser code OK? Oder gibt es eine bessere Möglichkeit, dies zu erreichen. Ich würde sagen, es gibt zwei Dinge:
Sie wickeln ein Versprechen in
new Promise
wenn es nicht notwendig ist und diefetch
nennen kann fehlschlagen,sollten Sie handeln, damit Ihre aufrufende Methode nicht sitzen und warten, für ein Versprechen, das nie gelöst werden.Hier ist ein Beispiel (ich denke, das sollte die Arbeit für Ihre business-Logik, nicht 100% sicher):
Dagegen ruft Ihren code verwenden:
Nicht alles loggen, was da der Aufruf
http://example
wird nicht funktionieren, aber diecatch
handler wird nie ausgeführt.InformationsquelleAutor der Antwort CodingIntrigue
Es funktioniert und ist nicht wirklich ein problem, außer, wenn ein Anrufer von
makeRequest
erwartet von Versprechen zu erfüllen. So, du brichst den Vertrag.Stattdessen könnte man verzögern, das Versprechen, oder (in diesem Fall) ablehnen, mit status-code/error.
InformationsquelleAutor der Antwort nullpotent
Als andere erklärte, es ist wahr, dass es nicht wirklich ein Problem, wenn Sie nicht lösen können/ablehnen ein Versprechen. Trotzdem würde ich der Lösung Ihres Problems ein wenig anders:
Bedeutet das, dass ich ablehnen würde jede schlechte Antwort Stand und dann behandeln Sie diese in Ihrem
error handler
IhrermakeRequest
.InformationsquelleAutor der Antwort Fidel90