我无法理解为什么拒绝没有通过承诺链传递,我希望有人能够帮助我理解原因。对我来说,将功能附加到一系列承诺意味着我依赖于最初的承诺来实现的意图。这很难解释,所以让我先展示一个我的问题的代码示例。(注意:这个例子是使用 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
好吧,对我来说,这个结果没有意义。通过附加到这个 Promise 链上,每一个都暗示了它将依赖于 d1 的成功解决和传递到链上的结果的意图。如果promise1 中的promise 没有收到wins 值,而是在它的错误处理程序中得到了一个err 值,那么链中的下一个promise 怎么可能调用它的success 函数呢?它无法将有意义的值传递给下一个 Promise,因为它本身没有获得值。
我可以用另一种方式来描述我的想法:共有三个人,John、Ginger 和 Bob。约翰拥有一家小部件商店。Ginger 走进他的商店,要了一袋颜色各异的小玩意儿。他没有库存,所以他向他的分销商发送请求,要求将它们运送给他。与此同时,他给了 Ginger 一张雨票,说明他欠她一袋小工具。Bob 发现 Ginger 正在获取小部件,并请求在她完成这些小部件后让他获取蓝色小部件。她同意并给了他一张纸条,说明她会的。现在,John 的经销商在他们的供应中找不到任何小部件,并且制造商不再生产它们,所以他们通知 John,John 又通知 Ginger 她无法获得这些小部件。鲍勃自己没有得到任何蓝色小部件时,如何能够从姜那里得到蓝色小部件?
我对这个问题的第三个更现实的观点是这个。假设我有两个要更新到数据库的值。一个依赖于另一个的 id,但是在我已经将其插入数据库并获得结果之前,我无法获取该 id。最重要的是,第一个插入依赖于来自数据库的查询。数据库调用返回我用来将两个调用链接成一个序列的承诺。
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 失败,它将调用第一个 then 的 err 函数。但随后它会调用下一个承诺的成功函数。虽然该承诺期待第一个值的结果,但它会从其错误处理函数中获取错误消息。
所以,我的问题是,如果我必须在我的成功函数中测试错误,为什么我会有一个错误处理函数?
很抱歉这篇文章的长度。我只是不知道如何用另一种方式解释它。
更新和更正
(注意:我删除了我曾经对一些评论做出的回复。因此,如果有人对我的回复发表评论,他们的评论可能会因为我删除它而显得断章取义。抱歉,我尽量保持简短.)
谢谢所有回复的人。我想首先向大家道歉,因为我的问题写得太差了,尤其是我的伪代码。我试图保持简短有点过于激进。
感谢Bergi的回复,我想我在我的逻辑中发现了错误。我想我可能忽略了另一个导致我遇到的问题的问题。这可能导致承诺链的工作方式与我想象的不同。我仍在测试我的代码的不同元素,所以我什至不能形成一个正确的问题来看看我做错了什么。我确实想更新你们所有人,并感谢你们的帮助。