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 validationErrorRespuestas:
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
.catchfalta algún lugar en el código , toda la aplicación explotará con un error irremediable ..handlerforthenes 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..thenmanejadores 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.