Javascript 蓝知更鸟承诺-然后终于
我在《蓝鸟/承诺》中遇到了一些问题。 对于允诺人来说,无论是要求完全满足还是拒绝,一切都很好。然而,当我们在finally块中返回Promise2时,它只适用于reject,而对于fullfil,我们在then的回调中没有定义Javascript 蓝知更鸟承诺-然后终于,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我在《蓝鸟/承诺》中遇到了一些问题。 对于允诺人来说,无论是要求完全满足还是拒绝,一切都很好。然而,当我们在finally块中返回Promise2时,它只适用于reject,而对于fullfil,我们在then的回调中没有定义 function getPromise1() { return new Promise(function(fulfill, reject) { fulfill("OK1"); }); } function getPromise2() {
function getPromise1() {
return new Promise(function(fulfill, reject) {
fulfill("OK1");
});
}
function getPromise2() {
return new Promise(function(fulfill, reject) {
fulfill("OK2");
});
}
getPromise1()
.then(function(c){
console.log(c);
})
.catch(function(e) {
console.log(e);
})
.finally(function() {
return getPromise2();
})
.then(function(c){
console.log(c);
})
.catch(function(e) {
console.log(e);
});
输出:
OK1
未定义最后块不会更改返回值 .finally()有特殊的语义,因为不能从处理程序修改最终值
Bluebird将等待它,但它不会更改返回值(这是一个固执己见的选择,并与建议的ECMAScript标准语义保持一致,比如某些语言中的
finally
,而与其他语言不同)。如果您想链接处理程序而不考虑之前承诺的结果,可以使用.reflect()将结果转换为
官方文档是,尽管在撰写本文时它并没有真正使这个用例非常清楚
更好的例子:
Promise.resolve("OK1")
.then(function(x) {
console.log(x); // outputs OK1
return Promise.reject("Rejection demo");
})
.reflect()
.then(function(settled) {
if (settled.isRejected()) {
// outputs Rejected: Rejection demo
console.log("Rejected:", settled.reason());
}
if (settled.isFulfilled()) {
console.log("Fulfilled:", settled.value()); // skipped
}
return Promise.resolve("OK2");
})
.then(function(c){
console.log(c); // outputs OK2
});