2014-10-31 190 views
2

開始學習Ember後,每當引用Promise Object時都會感到困惑。我知道對象,例如類X或JSON對象的實例。例如,當有人說方法m返回一個JSON對象時,我知道期望鍵值對。我如何將這種理解與承諾對象聯繫起來?是promise對象的一個​​值(可以是數組,字符串,數字,JSON對象等)?什麼是承諾對象?

如果一個方法返回一個承諾對象,我應該期待什麼?

+3

[沒有這樣的東西作爲JSON對象](http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/)。 – nnnnnn 2014-10-31 10:24:50

+0

確實,但JSON語法經常被稱爲JSON對象不是?當你從JSON數據創建一個對象時,人們把它作爲JSON對象引用。 – Bala 2014-10-31 10:25:53

+0

Json對象 - http://docs.oracle.com/javaee/7/tutorial/doc/jsonp003.htm – Bala 2014-10-31 10:28:48

回答

6

一個承諾是EcmaScript的6(ES6),對此有許多polyfills and libaries(即實現了ES5的JavaScript引擎)的一個新的對象類型,並允許(在其他好處中)走出臭名昭著回調地獄的,並且可以輕鬆地編寫和讀取異步代碼。

允諾可以有這三種狀態的一個(也是唯一一個):

  • 未決
  • 滿足
  • 拒絕

如果承諾是拒絕或履行,它也有一個結算了狀態。

基本上,它是具有then屬性(主要),這是一個function在於至少需要一個函數作爲參數,並且可以採取兩種對象:如果承諾返回的第一個將被調用滿足狀態,如果承諾返回拒絕狀態

then函數返回自己的另一個承諾,所以承諾都是可鏈接第二個會被調用。

承諾對象比我剛在這裏寫的要複雜得多,但它只是給你一個開始。

順便說一句,你可能使用了一個承諾類對象(注意後綴),如果你使用jQuery:$.ajax()返回一個承諾狀物體(那些被稱爲thenable s)表示,有一個done(和一個then)屬性,它是一個function,它接受函數作爲參數看起來像 a fulfilled函數(它通常只接受一個參數)。 Promise對象也可能有一個done函數屬性(不標準化,AFAIK,但幾乎所有的polyfill和庫實現它),其行爲像一個then函數,只是它不返回一個承諾(因此名稱:如果你完成與承諾,然後使用done(),但如果你需要做出承諾的結果,使用then())。

例如: - 你可能已經看到或書面像這樣:

$.ajax({url: '/path/to/html/piece'}) 
    .done(function(data) { 
     $('whateverSelector').html(data); 
    }); 

但是jQuery的調用承諾,即使他們是thenable S,不履行promise spec

+0

一個嚴重問題的好答案。值得一提的是'.done'的用途。此外 - 承諾類似的對象被稱爲「然後'控制器」 - 因爲你的術語是在這個答案的其餘部分,你可能想提到這一點。 – 2014-10-31 11:40:01

+0

謝謝,我根據(我希望)您的評論編輯了我的答案。 – laruiss 2014-10-31 13:01:36

4

承諾對象是它的名字說它是 - 一個承諾。在像Ember和Angular這樣的前端框架中promise是一個異步調用返回的對象。這個調用而不是阻塞整個系統會返回一個承諾,它將最終包含異步調用返回的數據。

承諾有一個名爲resolve的事件,當響應來臨時觸發。這就是承諾對象通常使用的方法叫做then的原因。您可以使用它像這樣(Ember.js文檔後):

var promise = fetchTheAnswer(); 

promise.then(fulfill, reject); 

function fulfill(answer) { 
    console.log("The answer is " + answer); 
} 

function reject(reason) { 
    console.log("Couldn't get the answer! Reason: " + reason); 
} 

當您的要求被滿足的承諾會調用該方法fulfillanswer(響應)作爲參數,當請求被拒絕(即。當資源不存在時)它將調用方法rejectreason(錯誤)作爲參數。

這樣的對象與其他面嚮對象語言(如java)中的對象相似 - 它們同時包含可以調用它們的數據和方法。