Esta es probablemente una pregunta tonta, pero a mitad de la cadena de promesas, ¿cómo rechaza una promesa desde dentro de una de las funciones de then? Por ejemplo:
someActionThatReturnsAPromise()
.then(function(resource) {
return modifyResource(resource)
})
.then(function(modifiedResource) {
if (!isValid(modifiedResource)) {
var validationError = getValidationError(modifiedResource);
// fail promise with validationError
}
})
.catch(function() {
// oh noes
});
Ya no hay una referencia a la función original de resolver / rechazar o al PromiseResolver. ¿Se supone que debo agregar return Promise.reject(validationError);
?
javascript
promise
chinabuffet
fuente
fuente
throw validationError
Respuestas:
Si. Sin embargo, es tan complicado solo en jQuery, con una biblioteca compatible con Promise / A + , también podría simplemente
throw validationError;
Entonces tu código se vería así
someActionThatReturnsAPromise() .then(modifyResource) .then(function(modifiedResource) { if (!isValid(modifiedResource)) throw getValidationError(modifiedResource); // else ! return modifiedResource; }) .catch(function() { // oh noes });
fuente
.catch
falta algún lugar en el código , toda la aplicación explotará con un error irremediable ..handler
forthen
es sincronización y la excepción puede detectarse. Si el controlador es asíncrono, debe devolver una promesa para eventualmente rechazarlo. Entonces, siempre devolver Promise.reject () en lugar de lanzar tiene sentido para mí. Porque si lanza un controlador asíncrono, la biblioteca no puede atraparlo y pasará silenciosamente. Tener cuidado..then
manejadores en una promesa :-) Si estás usando una API no promisificada, inclusoreturn Promise.reject()
te ayudará.p.then(function() { doAsync(function() { throw new Error("won't catch"); }); });
EDITAR: oh bien, releí tu comentario, estoy totalmente contigo, ¡estamos en la misma página! Quería señalarlo al OP :)doAsync(function() { return Promise.reject(new Error("won't catch, won't throw")); })
tampoco funciona allí, simplemente falla silenciosamente. Realmente debería serlodoAsync().then(function() { throw new Error("will be caught"); })
cuando trabajas con promesas.