Promise對異步編程的貢獻以及基本API瞭解

異步: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致使的性能問題
相關文章
相關標籤/搜索