rsvp.js如何处理被拒绝的承诺和失败回调链
Re:https://github.com/tildeio/rsvp.js
我有一个名为doSomething()的函数,稍后再执行一些操作,然后返回一个RSVP.Promise。 然后,一串成功和失败回调被注册到返回的承诺中(请参阅下面的代码)。 我期望的行为是,如果承诺得以实现,那么与承诺挂钩的成功回调链将被解雇,如果承诺被拒绝(失败),则失败回调链将被解雇。
当承诺被履行时,我会得到预期的行为,但是当我的承诺被拒绝时,我得到的行为与我预期的不同。 也就是说,成功回调被链接并且一个成功回调的输出被传递给链中的下一个成功回调。 但看起来失败的回调没有链接。 它们的行为几乎像try / catch块中的catch(请参阅下面的代码和输出)。
有人可以解释这种行为吗? 这是真的假设它工作的方式,或者这是rsvp.js处理被拒绝/失败的承诺的错误方式,该承诺有一系列注册失败回调的回调? 我现在正在阅读Promises / A +规范来尝试解决这个问题,但如果有人知道这些东西,他们会很乐意听到你的解释。 提前致谢。
jsfiddle:http://jsfiddle.net/rylie/VYSj7/2/
doSomething() // returns an RSVP.Promise object
.then(
function(message) { console.log("then success 1: " + message); return "from success 1"; }, // success callback
function(message) { console.log("then failure 1: " + message); return "from failure 1"; } // failure callback
)
.then(
function(message) { console.log("then success 2: " + message); return "from success 2"; }, // success callback
function(message) { console.log("then failure 2: " + message); return "from failure 2"; } // failure callback
)
.then(
function(message) { console.log("then success 3: " + message); return "from success 3"; } // success callback
)
.then(
null,
function(message) { console.log("then failure 4: " + message); return "from failure 4"; } // failure callback
)
.then(
function(message) { console.log("then success 5: " + message); return "from success 5"; }, // success callback
function(message) { console.log("then failure 5: " + message); return "from failure 5"; } // failure callback
);
**当承诺完成(成功)时,这是我得到和预期的输出:
then success 1: Promise fulfilled!
then success 2: from success 1
then success 3: from success 2
then success 5: from success 3
**当承诺被拒绝(失败)时,这是我得到的输出:
then failure 1: Promise rejected!
then success 2: from failure 1
then success 3: from success 2
then success 5: from success 3
**这是我的预期(拒绝/失败的承诺):
then failure 1: Promise rejected!
then failure 2: from failure 1
then failure 4: from failure 2
then failure 5: from failure 4
你应该忘记.then()
甚至需要超过1个参数并使用.catch
方法,这会更有意义。
Promise提供了一些同步代码结构的对应关系,但是当您只有低级别的.then()
时,这不是很明显。 你正在寻找的基本上是一个回调/回调聚合的数组,但这不是承诺的重点。
.catch(fn)
与.catch(fn)
.then(null, fn)
:
doSomething().then(function(val) {
console.log(val);
}).catch(function(e) {
console.error(e);
});
与同步代码并行(想象doSomething
同步返回):
try {
var val = doSomething();
console.log(val);
}
catch(e) {
console.error(e);
}
多个捕获(记住.catch
是更可读的别名.catch
.then(null, fn)
doSomething().then(function(val) {
console.log(val);
}).catch(function(e) {
return e;
}).catch(function(e){
//Will not get here ever
//because error thrown from doSomething()
//was handled in the upper catch which doesn't trow
});
相似之处:
try {
try {
var val = doSomething();
console.log(val);
}
catch(e) {
//no need for explicit return e
}
}
catch( e ) {
//Will not get here ever
//because error thrown from doSomething()
//was handled in the upper catch which doesn't trow
}
所以现在你应该注意到你可以通过抛出而不是返回http://jsfiddle.net/VYSj7/3/创建预期的结果
.catch()
是IMO承诺库提供的重要方法,将来也会包含在内置的Javascript承诺中。 但是,如果没有提供这样的方法,那么可以(或者应该是,不幸的是,有些实现不使用原型):
Promise.prototype.catch = function(fn) {
return this.then(null, fn);
};
另请参见拒绝轮到履行
链接地址: http://www.djcxy.com/p/55497.html上一篇: How rsvp.js handles rejected promise with chain of failure callbacks
下一篇: node js value return