一、Promise概述
Promise 是異步編程的一種解決方案,解決了回調地獄,還提供了豐富的 API 用於鏈式調用異步任務。在小程序中,Promise 可以用於異步請求、文件讀寫、動畫效果等多個方面,更是開發中必不可少的一部分。
二、Promise狀態
Promise 只有三種狀態:pending(進行中)、fulfilled(已成功)和 rejected(已失敗),狀態的變更不可逆。
const promise = new Promise((resolve,reject) => { // ... resolve('success') // or // reject('error') }) promise.then((res) => { console.log(res) // success }).catch((err) => { console.log(err) // error })
三、Promise使用場景
在小程序中,Promis可以應用於很多場景。例如異步請求。
const request = (url) => { return new Promise((resolve, reject) => { wx.request({ url, success(res) { resolve(res.data) }, fail(err) { reject(err) } }) }) } // 在使用時,可以直接鏈式調用 request('https://api.github.com/users') .then((res) => { console.log(res) return request('https://api.github.com/users/test') }) .then((res) => { console.log(res) }) .catch((err) => { console.log(err) })
還可以應用於文件讀寫、動畫效果等多個方面。下面以文件讀寫為例來介紹Promise的應用。
四、Promise應用:文件讀寫
1、讀取文件內容
const readFile = (filePath) => { return new Promise((resolve, reject) => { wx.readFile({ filePath: filePath, encoding: 'utf8', success(res) { resolve(res.data) }, fail(err) { reject(err) } }) }) } // 調用 readFile('/xx/xx/file.txt').then((data) => { console.log(data) }).catch((err) => { console.log(err) })
2、寫入文件內容
const writeFile = (filePath, content) => { return new Promise((resolve, reject) => { wx.writeFile({ filePath, data: content, success() { resolve() }, fail(err) { reject(err) } }) }) } // 調用 writeFile('/xx/xx/file.txt', 'hello world').then(() => { console.log('寫入成功') }).catch((err) => { console.log(err) })
五、Promise擴展
Promise提供了多個API,值得掌握。下面簡單介紹幾個:
1、Promise.all(iterable):接收一個 Promise 實例的 iterable 對象,當所有 Promise 實例都成功時,返回的Promise實例狀態才改變。
const p1 = Promise.resolve(1) const p2 = Promise.resolve(2) const p3 = Promise.resolve(3) Promise.all([p1, p2, p3]).then((res) => { console.log(res) // [1, 2, 3] }).catch((err) => { console.log(err) })
2、Promise.race(iterable):接收一個 Promise 實例的 iterable 對象,只要有一個 Promise 實例狀態改變,返回的 Promise 實例的狀態就改變。
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p1') }, 1000) }) const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve('p2') }, 500) }) Promise.race([p1, p2]).then((res) => { console.log(res) // p2 }).catch((err) => { console.log(err) })
六、總結
Promise是異步編程中非常重要的一個概念,掌握Promise的使用對小程序開發非常有幫助。在使用過程中,我們應注意Promise的狀態變更不可逆以及錯誤處理方法的正確使用等細節問題。同時,多了解Promise的擴展方法,能夠讓我們在開發中更加得心應手。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/235617.html