Javascript 蓝知更鸟承诺-然后终于

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() {

我在《蓝鸟/承诺》中遇到了一些问题。 对于允诺人来说,无论是要求完全满足还是拒绝,一切都很好。然而,当我们在finally块中返回Promise2时,它只适用于reject,而对于fullfil,我们在then的回调中没有定义

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
    });