Promessas acorrentadas não repassando rejeição

Eu tenho um problema em entender por que as rejeições não são passadas através de uma cadeia de promessas e espero que alguém possa me ajudar a entender o porquê. Para mim, vincular funcionalidade a uma cadeia de promessas implica uma intenção de que estou dependendo de uma promessa original a ser cumprida. É difícil explicar, então deixe-me mostrar um exemplo de código do meu problema primeiro. (Nota: este exemplo está usando o nó e o módulo do nó adiado. Eu testei este com o Dojo 1.8.3 e tive os mesmos 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());

Os resultados da execução desta operação são esta saída:

promise1 rejected
promise2 resolved
promise3 resolved

Ok, para mim, esse resultado não faz sentido. Ao se apegar a essa cadeia de promessas, cada uma delas implica a intenção de depender da resolução bem-sucedida de d1 e de um resultado ser passado adiante pela cadeia. Se a promessa na promessa1 não receber o valor de ganhos, mas, em vez disso, receber um valor de erro em seu manipulador de erros, como é possível que a próxima promessa na cadeia tenha sua função de sucesso denominada? Não há como passar um valor significativo para a próxima promessa, porque ela não obteve um valor em si.

Uma maneira diferente de descrever o que estou pensando é: há três pessoas, John, Ginger e Bob. John é dono de uma loja de widgets. Ginger entra em sua loja e pede uma sacola de roupas de cores variadas. Ele não os tem em estoque, então ele envia um pedido ao seu distribuidor para que eles sejam enviados para ele. Nesse meio tempo, ele dá a Ginger uma checagem de chuva dizendo que ele deve a bolsa de roupas. Bob descobre que Ginger está recebendo os widgets e solicita que ele receba o widget azul quando terminar com eles. Ela concorda e dá-lhe uma nota dizendo que ela vai. Agora, o distribuidor de John não pode encontrar widgets em sua oferta e o fabricante não os fabrica mais, então eles informam John, que por sua vez informa a Ginger que ela não pode obter os widgets. Como Bob pode conseguir um widget azul de Ginger quando não consegue nada?

Uma terceira perspectiva mais realista que tenho sobre esta questão é esta. Digamos que eu tenha dois valores que quero atualizar para um banco de dados. Um é dependente do id do outro, mas não consigo obter o id até que eu já tenha inserido em um banco de dados e obtido o resultado. Além disso, a primeira inserção depende de uma consulta do banco de dados. O banco de dados chama promessas de retorno que eu uso para encadear as duas chamadas em uma sequência.

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 });

Agora, nessa situação, se o db.query falhasse, ele chamaria a função err do primeiro. Mas então chamaria a função de sucesso da próxima promessa. Embora essa promessa esteja esperando os resultados do primeiro valor, ela recebe a mensagem de erro de sua função de manipulador de erro.

Então, minha pergunta é: por que eu teria uma função de erro ao entregar se eu tivesse que testar erros na minha função de sucesso?

Desculpe pela duração disso. Eu não sabia como explicar isso de outra maneira.

ATUALIZAÇÃO E CORREÇÃO

(Nota: eu removi uma resposta que eu fiz uma vez para alguns comentários. Então, se alguém comentou minha resposta, os comentários deles podem parecer fora de contexto agora que eu removi. Desculpe por isso, estou tentando manter isso o mais curto possível .)

Obrigado a todos que responderam. Eu gostaria de primeiro pedir desculpas a todos por escrever minha pergunta tão mal, especialmente meu pseudo código. Eu era um pouco agressivo demais para tentar resumir.

Graças à resposta de Bergi, acho que encontrei o erro na minha lógica. Eu acho que eu poderia ter negligenciado outro problema que estava causando o problema que eu estava tendo. Isso possivelmente está fazendo com que a cadeia de promessas funcione de maneira diferente do que eu pensava que deveria. Eu ainda estou testando diferentes elementos do meu código, então não posso nem formar uma pergunta apropriada para ver o que estou fazendo de errado ainda. Eu queria atualizar todos vocês e obrigado por sua ajuda.

questionAnswers(3)

yourAnswerToTheQuestion