javascript語言的執行環境的'單線程'的.javascript
所謂'單線程',就是指一次只能完成一件任務。若是有多個任務,就必須排隊,前面一個任務完成,再執行後面一個任務,以此類推。java
(實際上我認爲計算機從微觀上講都是單線程的,由於一臺機器在同一時間只能作一件事情。然而從宏觀上講,在咱們人的對時間的感知範圍內,認爲機器能夠在一個時間作多個事情。這就是咱們感知的異步/多線程/併發。本質上機器運算也是按照前後順序來的,這也就爲何會有微積分等這樣的學科來研究事物的本質了。)es6
概念這東西是人對事物認知的抽象描述,便於人們知識傳遞。而要理解好概念則要對引出這個概念的事物本質有所瞭解。ajax
同步任務:在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;編程
異步任務:不進入主線程,而進入任務隊列中的任務,只有任務隊列通知主線程,某個異步任務能夠執行了,這個任務纔會進入主線程執行。promise
事件循環(Event Loop):只有執行棧中的全部同步任務都執行完畢,系統纔會讀取任務隊列,看看裏面的異步任務哪些能夠執行,而後那些對應的異步任務,結束等待狀態,進入執行棧,開始執行。bash
// 例1
function foo(callback){//定義函數的時候將另外一個函數(回調函數)做爲參數傳入定義的函數中。
$ajax({
//...
success:callback//異步操做執行完畢後,再執行該回調函數,確保回調在異步操做以後執行。
})
}
function myCallback(result){
//...
}
foo(myCallback) // 回調函數自己是咱們約定俗成的一種叫法,咱們定義它,可是並不會本身去執行它,它最終被其餘人執行了。
// 例2
function f1(callback){
setTimeout(function () {
// f1的任務代碼
callback()
}, 1000)
}
f1(f2)
複製代碼
優勢:比較容易理解; 缺點:1.高耦合,維護困難,回調地獄;2.每一個任務只能指定一個回調函數;3.若是幾個異步操做之間並無順序之分,一樣也要等待上一個操做執行結束再進行下一個操做。多線程
Promise是抽象異步處理對象以及對其進行各類操做的組件。併發
Promise並非從JavaScript中發祥的概念。Promise最初被提出是在 E語言中, 它是基於並列/並行處理設計的一種編程語言異步
JavaScript的異步處理,最簡單的是利用回調函數,而Promise則是把相似的異步處理對象和處理規則進行規範化, 並按照採用統一的接口來編寫。
1. new Promise(fn) 返回一個promise對象
2. 在fn 中指定異步等處理
2.1. 處理結果正常的話,調用resolve(處理結果值)
2.2. 處理結果錯誤的話,調用reject(Error對象)
複製代碼
const promise = new Promise(function(resolve, reject) { // 不要問爲何寫resolve和reject,這是promise封裝的規定,好比你封裝一個函數也得按照你的規定傳參
// ... some code
if (/* 異步操做成功 */){
resolve(value);
} else {
reject(error);
}
});
複製代碼
Promise構造函數接受一個函數做爲參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由 JavaScript 引擎提供,不用本身部署。
resolve函數的做用是,將Promise對象的狀態從「未完成」變爲「成功」(即從 pending 變爲 resolved),在異步操做成功時調用,並將異步操做的結果,做爲參數傳遞出去。
reject函數的做用是,將Promise對象的狀態從「未完成」變爲「失敗」(即從 pending 變爲 rejected),在異步操做失敗時調用,並將異步操做報出的錯誤,做爲參數傳遞出去。
Promise實例生成之後,能夠用then方法分別指定resolved狀態和rejected狀態的回調函數。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
複製代碼
then方法能夠接受兩個回調函數做爲參數。第一個回調函數是Promise對象的狀態變爲resolved時調用,第二個回調函數是Promise對象的狀態變爲rejected時調用。其中,第二個函數是可選的,不必定要提供。這兩個函數都接受Promise對象傳出的值做爲參數。
想要查看更多的promise使用請看 es6.ruanyifeng.com/#docs/promi…
想要了解更多的promise知識請看 liubin.org/promises-bo…