Promesas encadenadas que no pasan por rechazo.

Tengo un problema para entender por qué los rechazos no se transmiten a través de una cadena de promesas y espero que alguien pueda ayudarme a entender por qué. Para mí, adjuntar funcionalidad a una cadena de promesas implica una intención que dependo de una promesa original a cumplir. Es difícil de explicar, así que primero déjeme mostrar un ejemplo de código de mi problema. (Nota: este ejemplo utiliza Node y el módulo de nodo diferido. Lo probé con Dojo 1.8.3 y obtuve los mismos resultados)

var d = require("deferred");

var d1 = d();

var promise1 = d1.promise.then(
    function(wins) { console.log('promise1 resolved'); return wins;},
    function(err) { console.log('promise1 rejected'); return err;});
var promise2 = promise1.then(
    function(wins) { console.log('promise2 resolved'); return wins;},
    function(err) { console.log('promise2 rejected'); return err;});
var promise3 = promise2.then(
    function(wins) { console.log('promise3 resolved'); return wins;},
    function(err) { console.log('promise3 rejected'); return err;});
d1.reject(new Error());

El resultado de ejecutar esta operación es esta salida:

promise1 rejected
promise2 resolved
promise3 resolved

Bueno, para mí, este resultado no tiene sentido. Al unirse a esta cadena de promesa, cada uno implica la intención de que dependerá de la resolución exitosa de d1 y del resultado que se transmita a través de la cadena. Si la promesa en promesa1 no recibe el valor de victorias, sino que obtiene un valor de error en su manejador de errores, ¿cómo es posible que la próxima promesa en la cadena tenga que llamar a su función de éxito? No hay forma de que pueda pasar un valor significativo a la siguiente promesa porque no obtuvo un valor en sí mismo.

Una manera diferente de describir lo que pienso es: hay tres personas, John, Ginger y Bob. John es dueño de una tienda de widgets. Ginger entra en su tienda y solicita una bolsa de widgets de colores variados. Él no los tiene en stock, por lo que envía una solicitud a su distribuidor para que se los envíen. Mientras tanto, le da a Ginger un cheque de lluvia indicando que le debe la bolsa de widgets. Bob descubre que Ginger está recibiendo los widgets y le pide que obtenga el widget azul cuando haya terminado con ellos. Ella está de acuerdo y le da una nota indicando que lo hará. Ahora, el distribuidor de John no puede encontrar widgets en su suministro y el fabricante ya no los hace, por lo que informan a John, quien a su vez informa a Ginger que no puede obtener los widgets. ¿Cómo puede Bob obtener un widget azul de Ginger cuando no obtuvo ninguno?

Una tercera perspectiva más realista que tengo sobre este tema es esta. Digamos que tengo dos valores que quiero actualizar a una base de datos. Uno depende de la identificación del otro, pero no puedo obtener la identificación hasta que ya la inserté en una base de datos y obtuve el resultado. Además de eso, la primera inserción depende de una consulta de la base de datos. Las llamadas a la base de datos devuelven promesas que utilizo para encadenar las dos llamadas en una secuencia.

var promise = db.query({parent_id: value});
promise.then(function(query_result) {
    var first_value = {
        parent_id: query_result[0].parent_id
    }
    var promise = db.put(first_value);
    promise.then(function(first_value_result) {
        var second_value = {
            reference_to_first_value_id: first_value_result.id
        }
        var promise = db.put(second_value);
        promise.then(function(second_value_result) {
            values_successfully_entered();
        }, function(err) { return err });
    }, function(err) { return err });
}, function(err) { return err });

Ahora, en esta situación, si db.query fallara, llamaría a la función err del primero entonces. Pero entonces llamaría a la función de éxito de la próxima promesa. Si bien esa promesa espera los resultados del primer valor, en su lugar obtendría el mensaje de error de su función de controlador de errores.

Entonces, mi pregunta es, ¿por qué tendría una función de manejo de errores si tengo que probar errores en mi función de éxito?

Lo siento por la longitud de esto. Simplemente no sabía cómo explicarlo de otra manera.

ACTUALIZACIÓN y corrección

(Nota: eliminé una respuesta que había hecho una vez a algunos comentarios. Entonces, si alguien comentó mi respuesta, sus comentarios podrían parecer fuera de contexto ahora que lo eliminé. Lo siento, estoy tratando de mantener esto lo más breve posible. .)

Gracias a todos los que respondieron. Primero, me gustaría disculparme con todos por escribir tan mal mi pregunta, especialmente mi pseudo código. Fui un poco demasiado agresivo al tratar de ser breve.

Gracias a la respuesta de Bergi, creo que encontré el error en mi lógica. Creo que podría haber pasado por alto otro problema que estaba causando el problema que estaba teniendo. Esto posiblemente está causando que la cadena de promesas funcione de manera diferente de lo que pensé que debería. Todavía estoy probando diferentes elementos de mi código, así que ni siquiera puedo formular una pregunta adecuada para ver qué estoy haciendo mal todavía. Quería actualizarlos a todos sin embargo y gracias por su ayuda.

Respuestas a la pregunta(3)

Su respuesta a la pregunta