前言:編程
當我過去初學JavaScript的時候,以爲使人最讓人難以琢磨的就是函數,在某些方面函數對象的應用,確實給我帶了不少方便。 JavaScript語言的執行環境是「單線程」的,因此試想一下,若是在JavaScript中沒有異步操做,咱們根本就不能使用它了。其中回調函數,就是早期用它來解決異步操做問題的。promise
【有關異步操做,我將會在以後的文章中,與你們共談,關於Generator】異步
回調函數的用法之廣,好比在某段代碼中插入回調函數,意味着將以前的打包好的「代碼塊」在某處再執行一次,上文中,也闡述了回調函數能解決異步編程的問題。 可是你們有沒有想過,當回調函數嵌套過多致使回調函數累積,咱們的代碼維護起來是否是就是極其的複雜,多層回調函數的嵌套使咱們的代碼就偏離了「高內聚,低耦合」的設計理念,牽一髮而動全身。異步編程
因此咱們將多層回調函數的嵌套,咱們稱之爲:回調地獄。(跟地獄這個詞扯上關係,都不是啥好事)。函數
當回調函數層層嵌套過多時,咱們將再也不運用回調函數解決異步操做問題,咱們使用Promise。spa
在ES6語言標準規定中,Promise是一個對象,表明着一個異步操做,它能夠獲取異步操做的消息,進而改變Promise自身的狀態。Promise這個對象有三種狀態:1.等待pending2.已失敗reject3.已成功fulfill。線程
有了Promise對象,咱們就能夠將異步操做以同步的方式表達出來。(這給Promise對象厲害的,可是它也有弊端,我將在文末與你們說明。)設計
##基本用法: ```//ES6中規定,promise對象是一個構造函數,用來生成Promise實例。code
var promise = new Promise(function(resolve,reject) {
//咱們剛建立Promise對象時,P是pending狀態。Promise對象用一個函數做爲參數,而且這個
函數有兩個參數resolve與reject,值得注意的是這兩個參數也是兩個函數。(「敲黑板了,別被我繞
暈了鐵子們」),咱們調用這兩個函數,就會將Promise的狀態切換到相對應的狀態,調用resolve,
會切換到成功狀態(並將異步操做的結果做爲參數傳遞給外面);調用reject是失敗的狀態。
})
Promise實例生成以後,咱們能夠經過then方法分別指定Resolved狀態和Rejected狀態的回調函數。
【Promise只是給了回調函數一個平臺,咱們將異步操做以同步方式表達出來】
promise.then(function(data) {
//當promise切換到fulfill狀態時,會調用該函數
console.log('當狀態爲fulfill我纔會被調用',data)
},function(error) {
//【在此咱們要注意:第二個回調函數是可選的】
//當promise切換到reject狀態時,會調用該函數
console.log('當狀態爲reject我纔會被調用',error)
})
//【then方法能夠接受兩個回調函數做爲參數,這兩個回調函數的參數都是都是promise對象傳出的值】。
//promise對象新建以後就會當即執行,then方法指定的回調函數將在當前腳本全部的同步任務執行完成以後才
會執行。
最後咱們來談一談Promise對象的缺點。
first:
咱們一旦建立了Promise對象,它是沒法取消的,而且它會當即執行(箭在弦上)
second:
咱們必需要將Promise與回調函數結合使用,意思是說,若是咱們不經過then方法設置回調函數,
Promise對象的結果將不會反應到外部。
【以上,就是我向你們介紹的有關Promise的初級概念,我將在下一篇文章中,
向你們介紹Promise對象的其餘方法好比catch,all等方法】
複製代碼
總結:我在這裏向你們打個比方,在沒有Promise對象以前,咱們層層嵌套的回調函數就像是手動扔手榴彈 ,咱們一通猛扔,可是並不知道各個手榴彈的爆以後炸信息;當咱們引用Promise對象以後, 對咱們來講不是扔手榴彈了,而是像發射導彈同樣,精準定位,精確打擊,而且咱們通 導彈發射裝置的雷達系統(Promise),能獲得每次發射的結果,來決定咱們下次是否還 要繼續發射。對象