Javascript:当履行承诺时,然后调用相同的函数

时间:2017-03-05 09:23:39

标签: javascript node.js promise

注意:不是How to always run some code when a promise is fulfilled in Angular.js 的重复问题,因为它特定于AngularJS。

我正在寻找类似jQuery的done或AngularJS的finally

我有一个得到解决或拒绝的承诺。无论是解决还是拒绝,我都希望在完成时运行相同的功能,如下所示:

var myPromise = new Promise(function(resolve, reject) {
    resolve('Success!');
    if( something ) {
        resolve('ok');
    } else {
        reject('not ok');
    }
});
myPromise.then(function(data) {
    var x = 1;
    var y = 2;
    console.log(data);
}, function(data) {
    var x = 1;
    var y = 2;
    console.log(data);
});

以上代码有效。问题是我正在复制两次相同的功能。我知道我可以有这样的命名函数:

var myPromise = new Promise(function(resolve, reject) { ... });
myPromise.then(doWork, doWork);
function doWork(data) {
    var x = 1;
    var y = 2;
    console.log(data);
}

但我想知道是否有办法:

  • 编写一次函数,而不是myPromise.then(doWork, doWork);和..
  • 使用匿名函数而不是命名函数。和..

1 个答案:

答案 0 :(得分:5)

在标准ES6承诺中,只需使用两次命名函数,就像在第二个示例中一样。标准ES6中没有finally

Bluebird promise library有一个.finally(),对你来说效果很好。

如果您真的不在乎承诺是否被拒绝,您可以将拒绝转变为这样的承诺,以便它始终满足:

myPromise.catch(err => err).then(() => {
   // put your code here
});

您也可以自己创建.finally()

if (!Promise.prototype.finally) {
    Promise.prototype.finally = function(fn) {
        return this.then(fn, fn);
    };
}

myPromise.finally(() => {
    // your code here
});

使用它时,返回的promise(用于进一步链接)将从fn返回的值中获取值。如果它返回一个值,则promise将采用该值。如果它返回一个承诺,那么父承诺将遵循该新承诺。如果它抛出,新的承诺将被拒绝。

还有.finally()的其他实现返回一个始终跟踪原始父承诺的promise,因此状态不受.finally()回调中发生的事件的影响。你没有在这里要求这个额外的功能所以我没有表现出稍微复杂的实现,但你可以看到像here in section 14.2这样的提议实现。