1)方便級聯呼叫:即呼叫依次發生的場景;
2)同步**編寫方式: promise使用then函式進行鏈式呼叫,一直點點點,是一種從左向右的橫向寫法;async/await從上到下,順序執行,就像寫同步**一樣,更符合**編寫習慣;
3)多個引數傳遞: promise的then函式只能傳遞乙個引數,雖然可以通過包裝成物件來傳遞多個引數,但是會導致傳遞冗餘資訊,頻繁的解析又重新組合引數,比較麻煩;async/await沒有這個限制,可以當做普通的區域性變數來處理,用let或者const定義的塊級變數想怎麼用就怎麼用,想定義幾個就定義幾個,完全沒有限制,也沒有冗餘工作;
4)同步**和非同步**可以一起編寫: 使用promise的時候最好將同步**和非同步**放在不同的then節點中,這樣結構更加清晰;async/await整個書寫習慣都是同步的,不需要糾結同步和非同步的區別,當然,非同步過程需要包裝成乙個promise物件放在await關鍵字後面;
5)基於協程: promise是根據函式式程式設計的正規化,對非同步過程進行了一層封裝,async/await基於協程的機制,是真正的「儲存上下文,控制權切換……控制權恢復,取回上下文」這種機制,是對非同步過程更精確的一種描述;
6)async/await是對promise的優化: async/await是基於promise的,是進一步的一種優化,不過在寫**時,promise本身的api出現得很少,很接近同步**的寫法;先說一下async的用法,它作為乙個關鍵字放到函式前面,用於表示函式是乙個非同步函式,因為async就是非同步的意思, 非同步函式也就意味著該函式的執行不會阻塞後面**的執行。
語法很簡單,就是在函式前面加上async 關鍵字,來表示它是非同步的,那怎麼呼叫呢?async 函式也是函式,平時我們怎麼使用函式就怎麼使用它,直接加括號呼叫就可以了,為了表示它沒有阻塞它後面**的執行,我們在async 函式呼叫之後加一句console.log;
async
function
timeout()
timeout()
;console.
log(
'雖然在後面,但是我先執行'
);
async 函式 timeout 呼叫了,但是沒有任何輸出,它不是應該返回 『hello world』, 先不要著急, 看一看timeout()執行返回了什麼? 把上面的 timeout() 語句改為console.log(timeout())
async
function
timeout()
console.
log(
timeout()
);console.
log(
'雖然在後面,但是我先執行'
);
原來async 函式返回的是乙個promise 物件,如果要獲取到promise 返回值,我們應該用then 方法, 繼續修改**
async
function
timeout()
timeout()
.then
(result
=>
)console.
log(
'雖然在後面,但是我先執行'
);
我們獲取到了"hello world』, 同時timeout 的執行也沒有阻塞後面**的執行,和 我們剛才說的一致。
這時,你可能注意到控制台中的promise 有乙個resolved,這是async 函式內部的實現原理。如果async 函式中有返回乙個值 ,當呼叫該函式時,內部會呼叫promise.solve() 方法把它轉化成乙個promise 物件作為返回,但如果timeout 函式內部丟擲錯誤呢? 那麼就會呼叫promise.reject() 返回乙個promise 物件, 這時修改一下timeout 函式
async
function
timeout
(flag
)else
}console.
log(
timeout
(true))
// 呼叫promise.resolve() 返回promise 物件。
console.
log(
timeout
(false))
;// 呼叫promise.reject() 返回promise 物件。
如果函式內部丟擲錯誤, promise 物件有乙個catch 方法進行捕獲。
timeout
(false).
catch
(err
=>
)
async 關鍵字差不多了,我們再來考慮await 關鍵字,await是等待的意思,那麼它等待什麼呢,它後面跟著什麼呢?其實它後面可以放任何表示式,不過我們更多的是放乙個返回promise 物件的表示式。注意await 關鍵字只能放到async 函式裡面 敏捷到底是什麼?
文 ivar jacobson 在支援軟體工程 比如rational統一過程rup 與敏捷陣營 比如scrum或是xp 之間,人們一直存在著衝突。也不難理解,因為這兩種方法間都是在用著彼此並不相容的方式來描述的。其實大可不必,因為他們背後的觀點全然是相輔相成的。關鍵在於該如何用對兩者來說都公平的方式...
我們到底是什麼?
我們到底是什麼?我們是一種生物電流 生物電流有幾種狀態,喜怒哀樂等,可以根據外部環境進行自我切換 該種生物電流附屬在一種器官硬體上面 我們可以從器官硬體上感知一些資訊,產生新的資訊生物電流,新產生的生物電流符合原先的標準 我們可以把資訊電流儲存在器官硬體上,但具體如何儲存等資訊無法被我們感知 我們的...
SDN到底是什麼
sdn到底是什麼?雖然這個概念已經被炒到了,但還沒有人對其給出乙個明確的概念。盛科網路總監張衛峰撰寫了自己關注sdn以來,對其認識的四個階段,最後乙個階段又回到了sdn字面的意思軟體定義網路,每個階段作者的新觀點,也會給我們帶來一些啟發。以下為原文 我對sdn的認識可以分為四個階段,最後乙個階段是在...