JavaScript中的Promise詳解
Promise是異步編程的一種解決方案,是一個對象,可以獲取異步操作的消息,大大改善了異步編程的困難,避免了回調(diào)地獄,比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更合理和更強大。
從語法上講,Promise是一個對象,它可以獲取異步操作的消息。提供了一個統(tǒng)一的API,各種異步操作都可以用同樣的方法進行處理
1、Promise的實例有三個狀態(tài):
(1)Pending(進行中)
(2)Resolved(已完成)
(3)Rejected (已拒絕)
2、Promise的實例有兩個過程
(1)pending > fulfiled :Resolved
(2)pending > rejected :Rejected
注意:一旦從進銷項狀態(tài)變?yōu)槠渌麪顟B(tài)就永遠不能更改狀態(tài)了
Promise的基本用法:
1、創(chuàng)建Promise對象
Promise 對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)、rejected(已失?。?/p>
Promise構(gòu)造函數(shù)接收一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是 resolve 和 reject
2、Promise 方法
Promise有五個常用方法:
(1)then()
then 方法可以接收兩個回調(diào)函數(shù)作為參數(shù),第一個回調(diào)函數(shù)是Promise對象的狀態(tài)改變?yōu)?resoved 是調(diào)用,第二個回調(diào)函數(shù)是 Promise 對象的狀態(tài)變?yōu)?rejected 時調(diào)用。其中第二個參數(shù)可以省略。
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) }) }) }).then(res=>{ return new Promise((resovle,reject)=>{ ajax('second').success(function(res){ resolve(res) }) }) }).then(res=>{ })
(2)catch()
該方法相當(dāng)于 then 方法的第二個參數(shù),指向 reject 的回調(diào)函數(shù)。
另一個作用是,在執(zhí)行resolve回調(diào)函數(shù)時,如果出錯,拋出異常,不會停止隕星,而是進入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 方法可以完成并進行任務(wù),它接收的是一個數(shù)組,數(shù)組的每一項都是 Promise 對象。當(dāng)數(shù)組中所有的 Promise 狀態(tài)都達到 resolved 的時候,all 方法的狀態(tài)就會變成 resolved,如果有一個狀態(tài)變成了 rejected。那么all 方法的狀態(tài)就會變成rejected。
javascript 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); //結(jié)果為:[1,2,3] })
(4)rece()
rece 方法和 all 一樣,接收的參數(shù)是一個每項都是 Promise 的數(shù)組,但是與 all 不同的是,當(dāng)最先執(zhí)行完的事件執(zhí)行完之后,就直接返回該 promise 對象的值
rece的實際作用:當(dāng)要做一件事,超過長時間就不做了,可以用這個方法來解決。
Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
(5)finally()
finally 方法用于指定不管 Promise 對象最后狀態(tài)如何,都會執(zhí)行的操作。(該方法是ES2018中引入標準的)
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
finally 方法的回調(diào)函數(shù)不接受任何參數(shù),這意味著沒有辦法知道前面的 Promise 狀態(tài)到底是 fulfilled 還是 rejected
promise .finally(() => { // 語句 }); // 等同于 promise .then( result => { // 語句 return result; }, error => { // 語句 throw error; } );
在上面代碼中,如果不寫 finally 方法,同樣的語句需要為成功和失敗兩種情況各寫一次。有了 finally 方法只需寫一次即可
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法詳解【先序、中序、后序】
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法,結(jié)合實例形式詳細分析了javascript二叉樹的定義及先序遍歷、中序遍歷、后序遍歷等相關(guān)遍歷操作實現(xiàn)技巧,需要的朋友可以參考下2019-02-02