2014-10-29 42 views
6

有沒有對Promise對象的兩個結果執行回調的方法?JavaScript原生Promise在兩個結果上執行回調

例如我想在執行xhr請求後做一些清理邏輯。所以,我需要做的是這樣的:

var cleanUp = function() { something.here(); } 
myLib.makeXhr().then(cleanUp,cleanUp); 

jQuery中DEFERED例如,我可以使用方法總是():

myLib.makeXhr().always(function() { something.here(); }); 

確實有希望支持這樣的事情?

+0

我看到現在有隻 然後和捕獲方法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise 所以可能沒有辦法(或擴展原型來做到這一點) – 2014-10-29 10:14:31

+0

jQuery.Deferred()。然後,如何解決多個參數http://stackoverflow.com/questions/24703887/jquery-deferred-then-how-to-resolve -with-multiple-parameters1 – zavg 2014-10-29 10:17:43

+1

正如本傑明回答 - 不。這就是爲什麼我通常在瀏覽器中使用https://github.com/petkaantonov/bluebird,並且它是連接,全部和所有其他方法。當然,這不是本地的,但它是解決許多承諾問題以及promisification。 – Jarema 2014-10-29 10:46:02

回答

7

沒有,有沒有。這是discussed,但規格很小。它不包括一堆其他功能。它旨在與圖書館承諾進行良好的互操作,並提供簡單的功能。

Here is a correct polyfill of that proposal originally made by StefPanner

此外,我不同意 當前 現在刪除的答案添加它自己,因爲他們都做錯了(作爲一個枚舉屬性 - 沒有樂趣)。即使我們忽略它對返回的承諾的返回值和錯誤狀態的影響。擴展本地承諾的預期方式是將它們繼承爲,可悲的是,沒有瀏覽器支持這一點,所以我們不得不等待。

而是與本地原型搞亂的,我們應該用不同的模式:

openDb().then(foo).then(bar).finally(close).then(more); 

易受我們忘記調用close,即使我們在我們的應用程序打開它100次,忘記甚至關閉曾經仍然可能是毀滅性的。在另一方面 - 我們可以使用其中的一些承諾庫提供建在自己的處理器模式:

openDb(function(db){ 
    return foo(db).then(bar);// chain here 
}).then(more); 

基本上 - 這個模式是指,而不必openDB回報的承諾 - 我們把它取一個函數回報一個承諾,當函數運行時,如果它返回一個承諾,我們等待這個承諾解決。它看起來是這樣的:

function openDb(withDb){ 
    return justOpenWithoutCleanUp(). 
      then(withDb). 
      then(clean, function(e){ clean(); throw e; }); // note the rethrow 
} 
-4

Promise對象支持'always'。 。

對於例如:

變種oPromise = jQuery.ajax({ URL:YOUR_URL })總是(函數(){ YOUR_CLEAN_UP_METHOD();} )

+0

@SanketPipariya這不是問題,但回答 – zavg 2014-10-29 10:19:01

+0

@SanketPipariya我以爲他試圖回答! – CinCout 2014-10-29 10:19:15

+0

downvoters並沒有告訴你 - 但他們在這裏使用jQuery低估了你 - 這與討論原生承諾的問題無關。 – 2014-10-29 10:39:26