1. 程式人生 > >關於Promise層層巢狀可讀性差問題

關於Promise層層巢狀可讀性差問題

 

Promise 是非同步程式設計的一種解決方案,比傳統的解決方案——回撥函式和事件——更合理和更強大。它由社群最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了 Promise物件 ES6 規定, Promise物件是一個建構函式,用來生成 Promise例項。 我們先來看看它的使用方法:
 1 const promise = new Promise(function(resolve, reject) {
 2 // ... some code  這裡寫非同步操作程式碼
3 ajax(api1,function(res){ 4 // 非同步操作成功,請求資料成功 5 resolve(value);//將promise設定為resolved完成狀態 6 },function(error){ 7 // 非同步操作失敗,請求資料失敗 8 reject(error);////將promise設定為rejected失敗狀態 9 }) 10 11 });
resolve函式的作用是 在非同步操作成功時呼叫,並將非同步操作的結果,作為引數傳遞出去; reject
函式的作用是 在非同步操作失敗時呼叫,並將非同步操作報出的錯誤,作為引數傳遞出去   Promise例項生成以後,可以用 then方法分別指定 resolved狀態和 rejected狀態的回撥函式。
promise.then(function(value) {
// success
}, function(error) {
// failure
});

then方法可以接受兩個回撥函式作為引數。第一個回撥函式是Promise物件的狀態變為resolved時呼叫,第二個回撥函式是Promise

物件的狀態變為rejected時呼叫。其中,第二個函式是可選的,不一定要提供。這兩個函式都接受Promise物件傳出的值作為引數。

上面程式碼也可成如下形式

promise.then(function(value) {
// success 
}).catch(function(error){
     //error
})

在success 裡面我們可以發起第二個請求

 

promise.then(function(value) {
// success
     ajax(api2,function(res){
          
     })
}).catch(function(error){
     //error
})

 

這個時候我們的兩個請求明顯的就有順序

像是這樣  new Promise(ajax1).then(ajax2).catch() ,使用了鏈式呼叫代替了巢狀結構,這樣就避免了層層巢狀使的程式碼可讀性太差!