У меня проблема с пониманием того, почему отклонения не передаются через цепочку обещаний, и я надеюсь, что кто-то сможет помочь мне понять, почему. Для меня добавление функциональности в цепочку promises подразумевает намерение, что я в зависимости от оригинального обещания выполнить. Это трудно объяснить, поэтому позвольте мне сначала показать пример кода моей проблемы. (Примечание: в этом примере используется Node и отложенный модуль 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 не получает значения выигрышей, но вместо этого получает значение err в обработчике ошибок, как это возможно, чтобы следующее обещание в цепочке вызывало функцию успеха? Он не может передать значимую ценность следующему обещанию, потому что он не получил само значение.
По-другому я могу описать, что я думаю: есть три человека, Джон, Джинджер и Боб. У Джона есть магазин виджета. Джинджер входит в его магазин и просит сумку виджетов разных цветов. У него их нет на складе, поэтому он посылает запрос своему дистрибьютору, чтобы отправить их ему. Между тем, он дает Джинджеру проверку дождя, заявляя, что он должен ей сумку виджетов. Боб узнает, что Джинджер получает виджеты и просит, чтобы он получил синий виджет, когда она закончила с ними. Она соглашается и дает ему записку о том, что она будет. Теперь, Джон дистрибьютор не может найти каких-либо виджетов в их поставках, и производитель не делает их больше, поэтому они сообщают Джону, который, в свою очередь, сообщает Джинджер, что она не может получить виджеты. Как Боб может получить синий виджет от Джинджер, когда сам не получил?
Третья, более реалистичная перспектива, которую я имею в этом вопросе, такова. Скажем, у меня есть два значения, которые я хочу обновить в базе данных. Один из них зависит от идентификатора другого, но я не могу получить идентификатор, пока я его не вставил в базу данных и не получил результат. Кроме того, первая вставка зависит от запроса из базы данных. База данных вызывает return promises, который я использую для объединения двух вызовов в последовательность.
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 первой. Но тогда это назвало бы функцию успеха следующего обещания. Хотя это обещание ожидает результатов первого значения, вместо этого оно получит сообщение об ошибке из своей функции обработчика ошибок.
Итак, мой вопрос в том, почему я должен иметь функцию обработки ошибок, если мне нужно проверить ошибки в моей функции успеха?
Извините за длину этого. Я просто не знал, как объяснить это по-другому.
ОБНОВЛЕНИЕ и исправление
(Примечание: я удалил ответ, который я когда-то сделал для некоторых комментариев. Поэтому, если кто-то прокомментировал мой ответ, их комментарии могут показаться вне контекста сейчас, когда я удалил его. Извините за это, я пытаюсь сохранить это как как можно короче.)
Спасибо всем, кто ответил. Я хотел бы сначала извиниться перед каждым за то, что он так плохо написал мой вопрос, особенно мой псевдокод. Я был слишком агрессивен, пытаясь удержать его.
Благодаря ответу Берги, я думаю, что нашел ошибку в своей логике. Я думаю, что, возможно, я пропустил еще одну проблему, которая вызывала проблему, которую я испытывал. Это, возможно, приводит к тому, что цепочка обещаний работает по-другому, чем я думал. Я все еще тестирую различные элементы своего кода, поэтому я даже не могу составить правильный вопрос, чтобы увидеть, что я делаю неправильно. Я действительно хотел обновить вас всех и поблагодарить вас за помощь.