Цепные обещания не переходят на отказ

У меня проблемы с пониманием того, почему отказы не передаются через цепочку обещаний, и я надеюсь, что кто-нибудь сможет помочь мне понять, почему. Для меня присоединение функциональности к цепочке обещаний подразумевает намерение, которое я полагаюсь на первоначальное обещание, которое должно быть выполнено. Это сложно объяснить, поэтому позвольте мне сначала показать пример кода моей проблемы. (Примечание: в этом примере используется Node и модуль отсроченного узла. Я протестировал это с Dojo 1.8.3 и получил те же результаты)

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

Результатами выполнения этой операции являются следующие выходные данные:

promise1 rejected
promise2 resolved
promise3 resolved

Ладно, для меня этот результат не имеет смысла. Присоединяясь к этой цепочке обещаний, каждый из них подразумевает намерение, что оно будет зависеть от успешного разрешения d1 и результата, передаваемого по цепочке. Если обещание в promise1 не получает значение выигрыша, а вместо этого получает значение err в своем обработчике ошибок, как возможно, чтобы следующее обещание в цепочке вызвало функцию успеха? Невозможно передать значимое значение следующему обещанию, потому что оно само не получило значения.

Я могу по-другому описать то, о чем я думаю: есть три человека, Джон, Джинджер и Боб. Джон владеет магазином виджетов. Джинджер заходит в свой магазин и запрашивает сумку виджетов разных цветов. У него их нет в наличии, поэтому он отправляет запрос своему дистрибьютору, чтобы они отправили его ему. В то же время, он дает Джинджер проверку дождя, заявляя, что он должен ей пакет виджетов. Боб узнает, что Джинджер получает виджеты и просит, чтобы он получил синий виджет, когда она закончит с ними. Она соглашается и дает ему записку о том, что она будет. Теперь дистрибьютор Джона не может найти какие-либо виджеты в своем ассортименте, а производитель их больше не производит, поэтому они информируют Джона, который, в свою очередь, сообщает Джинджер, что она не может получить виджеты. Как Боб может получить синий виджет от Джинджер, когда сам не получил?

Третий более реалистичный взгляд на этот вопрос у меня заключается в следующем. Скажем, у меня есть два значения, которые я хочу обновить в базе данных. Один зависит от идентификатора другого, но я не могу получить идентификатор, пока я не вставил его в базу данных и не получил результат. Кроме того, первая вставка зависит от запроса из базы данных. Обращение к базе данных возвращает обещания, которые я использую для объединения двух вызовов в последовательность.

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

Теперь, в этой ситуации, если db.query потерпит неудачу, он вызовет функцию err для first. Но тогда это вызвало бы функцию успеха следующего обещания. Хотя это обещание ожидает результатов первого значения, оно вместо этого получит сообщение об ошибке из своей функции обработчика ошибок.

Итак, мой вопрос: зачем мне использовать функцию обработки ошибок, если мне нужно проверить ошибки в моей функции успеха?

Извините за длину этого. Я просто не знал, как объяснить это по-другому.

ОБНОВЛЕНИЕ и исправление

(Примечание: я удалил ответ, который я когда-то сделал на некоторые комментарии. Поэтому, если кто-то прокомментировал мой ответ, его комментарии могут показаться неконтролируемыми после того, как я его удалил. Извините за это, я стараюсь сделать это как можно более коротким .)

Спасибо всем, кто ответил. Я хотел бы сначала извиниться перед всеми за то, что так плохо написал мой вопрос, особенно мой псевдокод. Я был слишком агрессивен, пытаясь сократить это.

Благодаря ответу Берги, я думаю, что нашел ошибку в моей логике. Я думаю, что мог пропустить другую проблему, которая вызывала проблему, с которой я столкнулся. Возможно, это приводит к тому, что цепочка обещаний работает не так, как я думал. Я все еще тестирую различные элементы своего кода, поэтому даже не могу составить правильный вопрос, чтобы увидеть, что я делаю неправильно. Я хотел обновить вас всех и поблагодарить за вашу помощь.

Ответы на вопрос(3)

Ваш ответ на вопрос