2017-03-05 42 views
0

注意:不是How to always run some code when a promise is fulfilled in Angular.js的重複問題,因爲這是針對AngularJS的。Javascript:如果承諾滿足,則調用相同的函數

我正在尋找類似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);,和..
  • 使用匿名函數而不是命名函數。和..

回答

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

使用此項時,返回的承諾(用於進一步鏈接)將取自您的fn返回的值。如果它返回一個值,這個承諾將會承擔這個價值。如果它返回一個承諾,父承諾將遵循這個新的承諾。如果拋出,新的承諾將被拒絕。

.finally()還有其他的實現返回一個始終跟蹤原始父承諾的承諾,因此該狀態不受.finally()回調中發生的情況影響。你沒有在這裏要求額外的功能,所以我沒有顯示稍微複雜的實現,但你可以看到一個像這樣的提議的實現here in section 14.2

+0

偉大的細節! <3 – evilReiko

相關問題