1. 程式人生 > >《深入理解ES6》——Promise非同步程式設計

《深入理解ES6》——Promise非同步程式設計

Promise的生命週期

    每個promise都會經歷一個短暫的生命週期:先是處於進行中(pending)的狀態,此時操作尚未完成,所以它也是未處理(unsettled)的;一旦非同步操作執行結束,Promise則變為已處理(settled)的狀態。已處理的狀態又分為以下兩種:

  • Fulfilled  Promise非同步操作成功完成
  • Rejected   由於程式錯誤或其他一些原因,Promise非同步操作未能成功完成。

then()方法

    所有Promise都有then()方法,它接受兩個引數第一個當Promise的狀態變為fulfilled時要呼叫的函式,與非同步操作相關的附加資料都會傳遞給這個完成函式;第二個

當Promise的狀態變為rejected時要呼叫的函式,其與完成時呼叫的函式類似,所有與失敗狀態相關的附加資料都會傳遞給這個拒絕函式。

    then()的兩個引數都是可選的,可以按照任意組合的方式來監聽Promise,執行完成或被拒絕都會被響應。來看下面例項:

let promise = readFile("example.txt");

promise.then(function(contents){
    //完成
    console.log(contents);
},function(err){
    //拒絕
    console.error(err.message);
});

promise.then(function(contents){
    //完成
    console.log(contents);
});

promise.then(null,function(err){
    //拒絕
    console.error(err.message);
});

    上面這3次then()呼叫操作的是同一個Promise。第一個同時監聽了執行完成和執行被拒;第二個只監聽了執行完成,錯誤時不報告;第三個只監聽了執行被拒,成功時不報告。

    Promise還有一個catch()方法,相當於只傳入拒絕處理程式的then()方法。如下,catch()方法和then()方法實現的功能是等價的:

promise.catch(function(err){
    //拒絕
    console.error(err.message);
});

//與以下呼叫相同
promise.then(null,function(err){
    //拒絕
    console.error(err.message);
});