JavaScript中的Promise詳解
Promise是異步編程的一種解決方案,是一個(gè)對(duì)象,可以獲取異步操作的消息,大大改善了異步編程的困難,避免了回調(diào)地獄,比傳統(tǒng)的解決方案回調(diào)函數(shù)和事件更合理和更強(qiáng)大。
從語法上講,Promise是一個(gè)對(duì)象,它可以獲取異步操作的消息。提供了一個(gè)統(tǒng)一的API,各種異步操作都可以用同樣的方法進(jìn)行處理
1、Promise的實(shí)例有三個(gè)狀態(tài):
(1)Pending(進(jìn)行中)
(2)Resolved(已完成)
(3)Rejected (已拒絕)
2、Promise的實(shí)例有兩個(gè)過程
(1)pending > fulfiled :Resolved
(2)pending > rejected :Rejected
注意:一旦從進(jìn)銷項(xiàng)狀態(tài)變?yōu)槠渌麪顟B(tài)就永遠(yuǎn)不能更改狀態(tài)了
Promise的基本用法:
1、創(chuàng)建Promise對(duì)象
Promise 對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)、rejected(已失?。?/p>
Promise構(gòu)造函數(shù)接收一個(gè)函數(shù)作為參數(shù),該函數(shù)的兩個(gè)參數(shù)分別是 resolve 和 reject
2、Promise 方法
Promise有五個(gè)常用方法:
(1)then()
then 方法可以接收兩個(gè)回調(diào)函數(shù)作為參數(shù),第一個(gè)回調(diào)函數(shù)是Promise對(duì)象的狀態(tài)改變?yōu)?resoved 是調(diào)用,第二個(gè)回調(diào)函數(shù)是 Promise 對(duì)象的狀態(tài)變?yōu)?rejected 時(shí)調(diào)用。其中第二個(gè)參數(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 方法的第二個(gè)參數(shù),指向 reject 的回調(diào)函數(shù)。
另一個(gè)作用是,在執(zhí)行resolve回調(diào)函數(shù)時(shí),如果出錯(cuò),拋出異常,不會(huì)停止隕星,而是進(jìn)入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 方法可以完成并進(jìn)行任務(wù),它接收的是一個(gè)數(shù)組,數(shù)組的每一項(xiàng)都是 Promise 對(duì)象。當(dāng)數(shù)組中所有的 Promise 狀態(tài)都達(dá)到 resolved 的時(shí)候,all 方法的狀態(tài)就會(huì)變成 resolved,如果有一個(gè)狀態(tài)變成了 rejected。那么all 方法的狀態(tài)就會(huì)變成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ù)是一個(gè)每項(xiàng)都是 Promise 的數(shù)組,但是與 all 不同的是,當(dāng)最先執(zhí)行完的事件執(zhí)行完之后,就直接返回該 promise 對(duì)象的值
rece的實(shí)際作用:當(dāng)要做一件事,超過長(zhǎng)時(shí)間就不做了,可以用這個(gè)方法來解決。
Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
(5)finally()
finally 方法用于指定不管 Promise 對(duì)象最后狀態(tài)如何,都會(huì)執(zhí)行的操作。(該方法是ES2018中引入標(biāo)準(zhǔn)的)
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)文章
4 種滾動(dòng)吸頂實(shí)現(xiàn)方式的比較
這篇文章主要介紹了4種滾動(dòng)吸頂實(shí)現(xiàn)方式的比較,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法詳解【先序、中序、后序】
這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之二叉樹遍歷算法,結(jié)合實(shí)例形式詳細(xì)分析了javascript二叉樹的定義及先序遍歷、中序遍歷、后序遍歷等相關(guān)遍歷操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02