本文實例講述了ES6新特性之promise對象。分享給大家供大家參考,具體如下:
1. promise 介紹
它是一個對象,也就是說與其他JavaScript對象的用法,沒有什么兩樣;其次,它起到代理作用(proxy),充當(dāng)異步操作與回調(diào)函數(shù)之間的中介。它使得異步操作具備同步操作的接口,使得程序具備正常的同步運行的流程,回調(diào)函數(shù)不必再一層層嵌套。
它的思想是,每一個異步任務(wù)立刻返回一個Promise對象,由于是立刻返回,所以可以采用同步操作的流程。這個Promises對象有一個then方法,允許指定回調(diào)函數(shù),在異步任務(wù)完成后調(diào)用。
異步操作f1返回一個Promise對象,它的回調(diào)函數(shù)f2寫法如下
(new Promise(f1)).then(f2);
2. promise 對象的三種狀態(tài)
① 異步操作未完成(pending)
② 異步操作已完成(resolved)
③ 異步操作失敗(rejected)
3. 工作過程
Promise對象使用then方法添加回調(diào)函數(shù)。then方法可以接受兩個回調(diào)函數(shù),第一個是異步操作成功時(變?yōu)閞esolved狀態(tài))時的回調(diào)函數(shù),第二個是異步操作失敗(變?yōu)閞ejected)時的回調(diào)函數(shù)(可以省略)。一旦狀態(tài)改變,就調(diào)用相應(yīng)的回調(diào)函數(shù),這兩個回調(diào)函數(shù)都接受異步操作傳回的值作為參數(shù)。
promise.then( console.log, console.error);
4. then 的鏈?zhǔn)绞褂?/p>
① 首先then方法返回的一個新的promise對象,因此可以采用鏈?zhǔn)綄懛ā?/p>
② then方法的第一個參數(shù)是Resolved狀態(tài)的回調(diào)函數(shù),第二個參數(shù)(可選)是Rejected狀態(tài)的回調(diào)函數(shù)。
③ 如下,promise的狀態(tài)一旦變?yōu)閞esolved,就依次調(diào)用后面每一個then指定的回調(diào)函數(shù),每一步都必須等到前一步完成,才會執(zhí)行。最后一個then方法的回調(diào)函數(shù)console.log和console.error,用法上有一點重要的區(qū)別。console.log只顯示回調(diào)函數(shù)step3的返回值,console.error可以顯示step1、step2、step3之中任意一個發(fā)生的錯誤,Promises對象的錯誤有傳遞性。
promise .then(step1) .then(step2) .then(step3) .then( console.log, console.error );
5. promise 對象的使用
var promise = new Promise(function(resolve, reject) { // promise的構(gòu)造函數(shù),Promise構(gòu)造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject // 異步操作的代碼 if (/* 異步操作成功 */){ resolve(value);//將異步的操作結(jié)果作為參數(shù)傳遞出去 } else { reject(error); }});其中resolve和reject它們是兩個函數(shù),由JavaScript引擎提供,不用自己部署。
resolve函數(shù)的作用:將Promise對象的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸腜ending變?yōu)镽esolved),在異步操作成功時調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去;
新聞熱點
疑難解答
圖片精選