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

evi*_*iko 0 javascript node.js promise

注意:如果在Angular.js中履行承诺时,如何始终运行某些代码并不是一个重复的问题,因为这是特定于AngularJS的.

我正在寻找类似jQuery的DONE或AngularJS的最后.

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

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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

但我想知道是否有办法:

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

jfr*_*d00 5

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

蓝鸟承诺图书馆.finally()这将满足您的需要.

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

myPromise.catch(err => err).then(() => {
   // put your code here
});
Run Code Online (Sandbox Code Playgroud)

你也可以.finally()自己创造:

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

myPromise.finally(() => {
    // your code here
});
Run Code Online (Sandbox Code Playgroud)

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

还有其他实现.finally()返回一个始终跟踪原始父承诺的promise,因此状态不受.finally()回调中发生的事情的影响.你没有在这里要求这个额外的功能,所以我没有显示稍微复杂的实现,但是你可以在14.2节中看到类似的建议实现.