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

У меня проблемы с пониманием того, почему отказы не передаются через цепочку обещаний, и я надеюсь, что кто-нибудь сможет помочь мне понять, почему. Для меня присоединение функциональности к цепочке обещаний подразумевает намерение, которое я полагаюсь на первоначальное обещание, которое должно быть выполнено. Это'Это трудно объяснить, поэтому позвольте мне сначала показать пример кода моей проблемы. (Примечание: в этом примере используется 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 и результата, передаваемого по цепочке. Если обещание в обещании1 неt получает значение wins, но вместо этого получает значение 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)

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