У меня возникли проблемы с пониманием того, почему отклонения не передаются через цепочку обещаний, и я надеюсь, что кто-то сможет помочь мне понять, почему. Для меня привязка функциональности к цепочке обещаний подразумевает намерение, что я в зависимости от оригинального обещания выполнить. Трудно объяснить, поэтому позвольте мне сначала показать пример кода моей проблемы. (Примечание:. Этот пример использует узел и модуль отложенного узла я проверил это с 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 не получает значения выигрышей, но вместо этого получает значение err в обработчике ошибок, как это возможно, чтобы следующее обещание в цепочке вызывало функцию успеха? Невозможно передать значимую ценность следующему обещанию, потому что оно не получило самого значения.
По-другому я могу описать то, что я думаю: есть три человека, Джон, Имбирь и Боб. У Джона есть магазин виджета. Джинджер входит в его магазин и просит сумку виджетов разных цветов. У него их нет на складе, поэтому он посылает запрос своему дистрибьютору, чтобы отправить их ему. Между тем, он дает Джинджеру проверку дождя, заявляя, что он должен ей сумку виджетов. Боб узнает, что Джинджер получает виджеты и просит, чтобы он получил синий виджет, когда она закончила с ними. Она соглашается и дает ему записку о том, что она будет. Теперь дистрибьютор John не может найти никаких виджетов в своих поставках, и производитель не делает их больше, поэтому они сообщают Джону, который, в свою очередь, сообщает Ginger, что не может получить виджеты. Как Боб может получить синий виджет от Джинджер, когда сам не получил?
Третья более реалистичная перспектива, которую я имею по этому вопросу. Скажем, у меня есть два значения, которые я хочу обновить в базе данных. Один из них зависит от идентификатора другого, но я не могу получить идентификатор, пока я его не вставил в базу данных и не получил результат. Кроме того, первая вставка зависит от запроса из базы данных. База данных вызывает обещания возврата, которые я использую для объединения двух вызовов в последовательность.
Теперь, в случае, если db.query завершился с ошибкой, он затем вызовет функцию err первой. Но тогда это назвало бы функцию успеха следующего обещания. Хотя это обещание ожидает результатов первого значения, вместо этого оно получит сообщение об ошибке из своей функции обработчика ошибок.
Итак, мой вопрос: зачем мне иметь функцию передачи ошибок, если мне нужно проверить наличие ошибок в моей функции успеха?
Извините за длину этого. Я просто не знал, как объяснить это по-другому.
UPDATE и коррекция
(Примечание:.. Я удалил ответ я однажды сделал некоторые замечания Так что если кто-нибудь прокомментировали мой ответ, их комментарии могут показаться из контекста теперь, когда я удалил его сожаление для этого я стараюсь держать это как можно короче.)
Спасибо всем, кто ответил. Я хотел бы сначала извиниться перед каждым за то, что он так плохо написал мой вопрос, особенно мой псевдокод. Я был слишком агрессивен, пытаясь удержать его.
Благодаря ответу Берги, я думаю, что нашел ошибку в своей логике. Я думаю, что, возможно, я пропустил еще одну проблему, которая вызывала проблему, которую я испытывал. Это, возможно, приводит к тому, что цепочка обещаний работает по-другому, чем я думал. Я все еще тестирую различные элементы своего кода, поэтому я даже не могу составить правильный вопрос, чтобы увидеть, что я делаю неправильно. Я действительно хотел обновить вас всех и поблагодарить вас за помощь.
Какие версии вы используете? Это отображает 'отклонил' 3 раза для меня на 0.10.0 и отложил 0.6.3. – loganfsmyth
Он работает и для меня на узле 0.8.3, и отложил 0.6.3 https://gist.github.com/Stuk/694b2377057453aa6946 –