¿Qué pasa si no resolvemos o rechazamos la promise?

Tengo un escenario en el que estoy devolviendo una promise. La promise básicamente da la respuesta de una request ajax.

Al rechazar la promise, muestra un cuadro de dialog de error que indica que hay un error del server.

Lo que quiero hacer es cuando el código de respuesta es 401, no quiero resolver la promise ni rechazarla (porque muestra un cuadro de dialog de error). Simplemente quiero networkingireccionar a la página de inicio de session.

Mi código se ve algo como esto

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) { networkingirectToLoginPage(); } else { response.json().then((error) => { if (!error.message) { error.message = constants.SERVER_ERROR; } reject({status,error}); }) } } }) }); } 

Como puede ver si el estado es 401, estoy networkingirigiendo a la página de inicio de session. La promise no se resuelve ni rechaza.

¿Está bien este código? ¿O hay alguna forma mejor de lograr esto?

Gracias.

Una promise es solo un object con properties en Javascript. No hay magia para eso. Por lo tanto, no resolver o rechazar una promise simplemente no cambia el estado de "pendiente" a cualquier otra cosa. Esto no causa ningún problema fundamental en Javascript porque una promise es solo un object regular de Javascript. La promise seguirá recibiendo basura (incluso si aún está pendiente) si ningún código guarda una reference a la promise.

La consecuencia real aquí es qué significa eso para el consumidor de la promise si su estado nunca cambia? Cualquier .then() oyentes para resolver o rechazar transiciones nunca serán llamados. La mayoría del código que usa promises espera que se resuelvan o rechacen en algún momento en el futuro (es por eso que las promises se usan en primer lugar). Si no lo hacen, entonces ese código generalmente nunca termina su trabajo.

Es posible que pueda tener algún otro código que termine el trabajo para esa tarea y la promise simplemente se abandona sin hacer lo suyo. No hay un problema interno en Javascript si lo haces de esa manera, pero no es así como se diseñaron las promises para que funcionen, y generalmente no es la forma en que el consumidor de promises espera que funcione.

Como puede ver si el estado es 401, estoy networkingirigiendo a la página de inicio de session. La promise no se resuelve ni rechaza.

¿Está bien este código? ¿O hay alguna forma mejor de lograr esto?

En este caso particular, todo está bien y una networkingirección es un caso un tanto especial y único. Una networkingirección a una nueva página del browser borrará por completo el estado de la página actual (incluido todo el estado de Javascript) por lo que está perfectamente bien tomar un atajo con la networkingirección y simplemente dejar otras cosas sin resolver. El sistema reiniciará completamente su estado de Javascript cuando la nueva página comience a cargarse, por lo que las promises que aún estén pendientes se limpiarán.

Siempre resuelve o rechaza la promise. Incluso si no está utilizando el resultado en este momento, a pesar de estar trabajando, es una muy mala práctica entrar porque a las promises les encantará tragar los errores, y cuanto más complejo sea su código, más difícil será encontrar los pocos lugares donde no completó explícitamente una promise (además, ni siquiera sabrá si ese es el problema).

Creo que el "qué pasa si no resolvemos el rechazo" ha sido respondido .then : es tu elección si agregar un .then o un .catch .

Sin embargo, ¿este código está bien? ¿O hay alguna forma mejor de lograr esto ? Yo diría que hay dos cosas:

Usted está ajustando una Protable en Protable new Promise cuando no es necesaria y la llamada de fetch puede fallar , debe actuar de esa manera para que su método de llamada no se quede esperando una Protable que nunca se resolverá.

Aquí hay un ejemplo (creo que esto debería funcionar para su lógica de negocios, no 100% seguro):

 const constants = { SERVER_ERROR: "500 Server Error" }; function makeRequest(url,params) { // fetch already returns a Promise itself return fetch(url,params) .then((response) => { let status = response.status; // If status is forbidden, networkingirect to Login & return nothing, // indicating the end of the Promise chain if(status === 401) { networkingirectToLoginPage(); return; } // If status is success, return a JSON Promise if(status >= 200 && status < 300) { return response.json(); } // If status is a failure, get the JSON Promise, // map the message & status, then Reject the promise return response.json() .then(json => { if (!json.message) { json.message = constants.SERVER_ERROR; } return Promise.reject({status, error: json.message}); }) }); } // This can now be used as: makeRequest("http://example", {}) .then(json => { if(typeof json === "undefined") { // Redirect request occurnetworking } console.log("Success:", json); }) .catch(error => { console.log("Error:", error.status, error.message); }) 

Por el contrario, llamando a su código usando:

 makeRequest("http://example", {}) .then(info => console.log("info", info)) .catch(err => console.log("error", err)); 

No se registrará nada porque la llamada a http://example fallará, pero el controller catch nunca se ejecutará.

Funciona y no es realmente un problema, excepto cuando una persona que llama de makeRequest espera cumplirla. Entonces, estás rompiendo el contrato allí.

En cambio, podría diferir la promise, o (en este caso) rechazar con código de estado / error.

Como otros dijeron, es cierto que no es realmente un problema si no resuelves / rechazas una promise. De todos modos, resolvería tu problema un poco diferente:

 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 { reject(response); } }) }); } makeRequest().then(function success(data) { //... }, function error(response) { if (response.status === 401) { networkingirectToLoginPage(); } else { response.json().then((error) => { if (!error.message) { error.message = constants.SERVER_ERROR; } //do sth. with error }); } }); 

Eso significa que rechazaría cada estado de respuesta incorrecto y luego manejaría esto en su error handler de error handler de su makeRequest .