Ho uno scenario in cui sto restituendo una promessa. La promessa fornisce fondamentalmente la risposta di una richiesta Ajax.cosa succede se non risolviamo o rifiutiamo la promessa
In caso di rifiuto della promessa viene visualizzata una finestra di errore che indica un errore del server.
Quello che voglio fare è quando il codice di risposta è 401, non voglio né risolvere la promessa né rifiutarla (perché mostra la finestra di errore). Voglio semplicemente reindirizzare alla pagina di accesso.
Il mio codice simile a questa
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});
})
}
}
})
});
}
Come si può vedere se lo stato è 401, sto reindirizzamento alla pagina di login. La promessa non è né risolta né respinta.
Questo codice è OK? Oppure c'è un modo migliore per farlo.
Grazie.
Come hai detto, Un reindirizzamento a una nuova pagina del browser cancella completamente lo stato corrente della pagina (incluso tutto lo stato di Javascript). Ma cosa succederà se mi sto reindirizzando in una singola app. Sto usando ReactJS. Quindi non ci sarà una nuova pagina del browser, solo una vista diversa. Se è perfettamente corretto prendere una scorciatoia in quel caso con il reindirizzamento e lasciare semplicemente le altre cose irrisolte. – Aniket
@Aniket - Quindi questo è un caso diverso che la tua domanda non descrive. Dovrai assicurarti che le cose vengano pulite correttamente in modo da non avere perdite di memoria. Non ho idea se ci sarebbe un problema con questo in reazione o meno. La prossima volta metti questo tipo di informazioni nella tua domanda. – jfriend00
Assicurati di non avere riferimenti alle funzioni 'reject' e' resolve', e non limitarti a fare riferimento alla promessa. Quindi, GC dovrebbe intervenire. Altrimenti, se il tuo codice fa ancora riferimento a 'resolve', ad esempio, la Promessa dovrà rimanere in sospeso nel caso in cui il tuo codice chiamasse sempre' resolve() '. Ecco un esempio di un'API Web che può perdere Promesse se non è attenta: https://github.com/w3c/webcomponents/issues/674 – trusktr