這里寫目錄標題
- 一、概念
- 二、示例
- 基本使用
- 使用 Promise 對象封裝Ajax
- then() 方法
- catch() 方法
一、概念
- 簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。
- Promise 是一個對象,Promise 提供統一的 API,各種異步操作都可以用同樣的方法進行處理。axios 的內部實現原理就是通過 Promise 實現的。
- Promise對象有以下兩個特點:
- 對象的狀態不受外界影響。有三種狀態:pending(進行中)、fulfilled(成功)和rejected(失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
- 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:從pending變為resolved和從pending變為rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果。
- Promise對象是一個構造函數,用來生成Promise實例,帶有一個回調函數,回調函數的兩個參數是 resolve(成功) 和 reject(失敗),這兩個參數他們也是函數。
二、示例
基本使用
function timeOut(ms) {// Promise對象是一個構造函數,用來生成Promise實例// 閉包函數:一個函數里面返回一個函數return new Promise((resolve, reject) => {// ... 模擬執行異步操作,后端返回的數據let res = {code: 200,//code:201data: {name: 'ES6學習!'},error: '失敗了!'}setTimeout(() => {// 異步執行成功if (res.code === 200) {resolve(res.data);// 異步執行失敗} else {reject(res.error);}},ms);});}// then方法的第一個參數是resolved狀態的回調函數,// 第二個參數是rejected狀態的回調函數,它們都是可選的。timeOut(4000).then((val)=>{console.log(val); //這里的值接收的是 resolved() 的值},(err)=>{console.log(err);//這里的值接收的是 rejected() 的值,輸出 失敗了});
Promise構造函數接受一個函數作為參數,該函數的兩個參數分別是resolve和reject。它們是兩個函數,由JavaScript引擎提供,不用自己部署。
resolve函數的作用是,將Promise對象的狀態從“未完成”變成“成功”(即從pending變為resolved),在異步操作成功時調用,并將異步操作的結果作為參數傳遞。
reject函數的作用是,將Promise對象的狀態從“未完成”變為“失敗”(即從pending變為rejected),在異步操作失敗時嗲用,并將異步操作報出的錯位u傳遞出去。
Promise 實例生成以后,可以用 then方法分別指定resolved狀態和 rejected狀態的回調函數。
使用 Promise 對象封裝Ajax
const getJson = function (url) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.open('GET', url);xhr.resposeType = 'json';xhr.setRequestHeader('Accept', 'application/json');xhr.send();xhr.onreadystatechange = function() {//console.log("READYSTATE"+ xhr.readyState);if (xhr.readyState === 4) { console.log("READYSTATE"+ xhr.status); if (xhr.status === 200) { resolve(this.responseText);} else {reject(new Error(xhr.statusText))}}}})}getJson('http://timor.tech/api/holiday/year/2024').then((data) => {console.log(data);}, (error) => {console.log(error);})
then() 方法
如果一個promise執行完后 返回的還是一個promise 實例(注意,不是原來那個Promise實例),會把這個promise 的執行結果,傳遞給下一次then中。因此可以采用鏈式寫法,即then方法后面再調用另一個then方法。
catch() 方法
catch(err=>{})方法等價于then(null,err=>{}),用于指定發生錯誤時的回調函數