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);......在标准的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节中看到类似的建议实现.
| 归档时间: |
|
| 查看次数: |
192 次 |
| 最近记录: |