異步:javascript
核心:java
如今運行的部分和未來運行的部分之間的關係
經常使用方案:ajax
從如今到未來的等待,一般使用一個回調函數在結果返回時獲得結果
控制檯(由於console族是由宿主環境即遊覽器實現的)可能會使用異步機制,在出現問題時使用斷點調試或者JSON化造成快照數組
異步和並行的區別:promise
異步:如今與未來的時間間隙 並行:同時發生的事
js引擎是單線程的,可是函數級別上執行順序仍然存在不可預測併發
併發交互 併發協做異步
回調存在的問題:函數
回調地獄:人腦計劃和回調驅動異步不匹配,致使思惟難以迅速找到整個回調流程 信任問題: 1.調用過早 2.調用過晚或者沒有調用 3.調用次數不正確(過多或者過少) 4.沒有把參數正確傳回 5.吞掉錯誤或者異常
事件循環(eventloop)oop
每一次時間循環稱爲一個tick
任務隊列性能
在tick後面掛載的隊列
回調帶來的問題致使的需求:
一種更同步、更順序、更阻塞的方式表達異步來提供與咱們大腦思惟一致
Promise順勢誕生:
對於回調函數帶來的問題的解決: 1.調用過早 本質:一個方法可能會同步執行也可能會異步執行,致使結果不可靠
function result(data) { console.log( a );//0(同步回調調用)、1(異步回調調用) } var a = 0; ajax( "..pre-cached-url..", result ); a++;
解決方案:then方法老是會異步調用其回調 2.調用過晚 解決方案:在Promise對象執行resolve或reject方法後,then註冊的回調函數會被自動執行 3.沒有被調用 解決方案: 1.只要決議,那麼回調函數就會調用完成回調和拒絕回調其中一個 2.回調函數出現錯誤,能夠在後續代碼中捕獲這些錯誤,固然回調已經被執行了 3.Promise自己永遠不被決議,可使用race這個競態機制來獲取一個輸出信號,防止其永久掛住程序 4.調用次數過多 解決方案:Promise只會接受第一次決議,並默默地忽略任何後續調用,即屢次決議是不會改變promise的狀態 5.沒有把參數正確傳回 解決方案:Promise在決議時,只接受第一個參數,若是須要多個參數,可使用數組或者對象包裹參數 6.吞掉錯誤或者異常 解決方案:在Promise建立過程當中或者查看決議過程當中,出現js異常,那麼異常會被捕捉而且使得這個promise被拒絕,能夠在下一個then中的reject回調捕獲這個異常 7.保證Promise可信任(保證返回的值爲Promise) 解決方案:Promise.resolve() 1.傳入一個非Promise、非thenable值,那麼會獲得用這個值填充promise 2.傳入一個真正的promise,那麼會原樣返回這個promise 3.傳入一個非Promise的thenable值,會展開這個值,持續到獲得一個非類Promise的值
第三方提供任務結束的能力,由咱們決定代碼下一步的行動
Promise 基本API
new Promise((resolve,reject)=>{ resolve()、reject() }) then() catch()
如何驗證是否爲promise 檢測是否具備then方法
快捷建立已經被決議的Promise:
Promise.resolve()//完成 Promise.reject()//拒絕
then和catch方法也會返回一個新的Promise
不要依賴promise回調的順序,即兩個p1.then();p2.then()不必定就是順序,在p1自己是resolve一個promise原生對象時,p2會先執行
var p3 = new Promise( function(resolve,reject){ resolve( "B" ); } ); var p1 = new Promise( function(resolve,reject){ resolve( p3 ); } ); p2 = new Promise( function(resolve,reject){ resolve( "A" ); } ); p1.then( function(v){ console.log( v ); } ); p2.then( function(v){ console.log( v ); } ); // A B <-- 而不是像你可能認爲的B A
侷限性:
1.順序錯誤處理,致使Promise鏈中的錯誤容易被忽略掉 2.單一值致使後續處理變量繁瑣 3.單決議在事件中須要注意建立新的Promise鏈 4.Promise致使的性能問題