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 })
promise.then(function(value) { // success ajax(api2,function(res){ }) }).catch(function(error){ //error })
像是這樣 new Promise(ajax1).then(ajax2).catch() ,使用了鏈式調用代替了嵌套結構,這樣就避免了層層嵌套使的代碼可讀性太差!