JavaScript中的Promise詳解
目錄
- Promise的基本用法:
- 1、建立Promise物件
- 2、Promise 方法
- 總結
Promise是非同步的一種解決方案,是一個物件,可以獲取非同步操作的訊息,大大改善了非同步程式設計的困難,避免了回撥地獄,比傳統的解決方案回撥函式和事件更合理和更強大。
從語法上講,Promise是一個物件,它可以獲取非同步操作的訊息。提供了一個統一的API,各種非同步操作都可以用同樣的方法進行處理
1、Promise的例項有三個狀態:
(1)Pending(進行中)
(2)Resolved(已完成)
(3)Rejected (已拒絕)
2、Promise的例項有兩個過程
(1)pending > fulfiled :Resolved
(2)pending > rejected :Rejected
注意:一旦從進銷項狀態變為其他狀態就永遠不能更改狀態了
Promise的基本用法:
1、建立Promise物件
Promise 物件代表一個非同步操作,有三種狀態:pending(進行中)、fulfilled(已成功)、rejected(已失敗)
Promise建構函式接收一個函式作為參www.cppcns.com數,該函式的兩個引數分別是 resolve 和 reject
2、Promise 方法
Promise有五個常用方法:
(1)then()
then 方法可以接收兩個回撥函式作為引數,第一個回撥函式是Promise物件的狀態改變為 resoved 是呼叫,第二個回撥函式是 Promise 物件的狀態變為 rejected 時呼叫。其中第二個引數可以省略。
let promise = new Promise((resolve,reject)=>{ ajax('first').success(function(res){ resolve(res); }) }) promise.then(res=>{ return new Promise((resovle,reject)=>{ ajax('second').success(function(res){ resolve(res) }) }) }).http://www.cppcns.comthen(res=>{ return new Promise((resovle,reject)=>{ ajax('second').success(function(res){ resolve(res) }) }) }).then(res=>{ })
(2)catch()
該方法相當於 then 方法的第二個引數,指向 reject 的回撥函式。
另一個作用是,在執行resolve回撥函式時,如果出錯,丟擲異常,不會停止隕星,而是進入catch 方法中。
p.then((data) => { console.log('resolved',data); },(err) => { console.log('rejected',err); } ); p.then((data) => { console.log('resolved',data); }).catch((err) => { console.log('rejected',err); });
(3)all()
all 方法可以完成並進行任務,它接收的是一個數組,陣列的每一項都是 Promise 物件。當陣列中所有的 Promise 狀態都達到 resolved 的時候,all 方法的狀態就會變成 resolved,如果有一個狀態變成了 rejected。那麼all 方法的狀態就會變成rejected。
let promise1 = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(1); },2000) }); let promise2 = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(2); },1000) }); let promise3 = new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(3); },3000) }); Promise.all([promise1,promise2,promise3]).then(res=>{ console.log(res); //結果為:[1,2,3] })
(4)rece()
rece 方法和 all 一樣,接收的引數是一個每項都是 Promise 的陣列,但是與 all 不同的是,當最先執行完的事件執行完之後,就直接返回該 promise 物件的值
rece的實際作用:當要做一件事,超過長時間就不做了,可以用這個方法來解決。
Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
(5)finally()
finally 方法用於指定不管 Promise 物件最後狀態如何,都會執行的操作。(該方法是ES2018中引入標準的)
promise .then(result => {}) .catch(error => {}) .finally(() => {});
finally 方法的回撥函式不接受任何引數,這意味著沒有辦法知道前面的 Promise 狀態到底是 fulfilled 還是 rejected
promise .finally(() => { // 語句 }); // 等同於 promise .then( result => { // 語句 return result; },error => { // 語句 throw error; } );
在上面程式碼中,如果不寫 finally 方法,同樣的語句需要為成功和失敗兩種情況各寫一次。有了 finally 方法只需寫一次即可
總結
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注我們的更多內容!