青鸟的承诺——然后终于
Bluebird promise - then after finally
我在 Bluebird/Promises 中遇到了一些问题。
对于 Promise1,无论是调用 fullfill 还是 reject,一切都正常。但是,当我们在 finally 块中 return Promise2 时,它仅适用于 reject 和 fullfil,我们在 then 的回调中得到 undefined。
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);
});
输出:
确定1
未定义
finally
块不会更改 return 值。
There are special semantics for .finally() in that the final value cannot be modified from the handler.
Bluebird 会等待它,但它不会更改 return 值(这是一个自以为是的选择,并与提议的 ECMAScript 标准语义一致 - 就像某些语言中的 finally
而不同于其他语言).
如果你想链接一个处理程序而不考虑之前的承诺结果,你可以使用 .reflect() 将结果转换为 PromiseInspection.
官方文档是 here,尽管在撰写本文时它并没有真正使这个用例非常清楚。
更好的例子:
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
});
我在 Bluebird/Promises 中遇到了一些问题。 对于 Promise1,无论是调用 fullfill 还是 reject,一切都正常。但是,当我们在 finally 块中 return Promise2 时,它仅适用于 reject 和 fullfil,我们在 then 的回调中得到 undefined。
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);
});
输出:
确定1
未定义
finally
块不会更改 return 值。
There are special semantics for .finally() in that the final value cannot be modified from the handler.
Bluebird 会等待它,但它不会更改 return 值(这是一个自以为是的选择,并与提议的 ECMAScript 标准语义一致 - 就像某些语言中的 finally
而不同于其他语言).
如果你想链接一个处理程序而不考虑之前的承诺结果,你可以使用 .reflect() 将结果转换为 PromiseInspection.
官方文档是 here,尽管在撰写本文时它并没有真正使这个用例非常清楚。
更好的例子:
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
});