生活随笔
收集整理的這篇文章主要介紹了
es6 --- Promise封装读取文件操作
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Promise:
- es6中為了解決回調(diào)地獄問題而產(chǎn)生的
Promise的參數(shù)
- Promise的參數(shù)是一個(gè)函數(shù).
- 每個(gè)Promise在實(shí)例化時(shí),都會(huì)立即執(zhí)行參數(shù)里的函數(shù)
const p = new Promise(()=>{console.log(1);
})// 解釋了上面的第2條
Promise參數(shù)的參數(shù)
- Promise的參數(shù)(函數(shù)),默認(rèn)有2個(gè)參數(shù)(resolve,reject).譯為:成功的回調(diào)、失敗的回調(diào)
- 每個(gè)Promise實(shí)例都可以通過.then方法傳入,成功的回調(diào)和失敗的回調(diào)
// 先假設(shè)拿到了數(shù)據(jù)
const p = new Promise((resolve,reject)=>{setTimeout(()=>{const data = 'async resolve data';resolve(data);},1000);
});// 使用異步得到的data,通過.then()方法傳入回調(diào)函數(shù)
p.then((data)=>{console.log(data);
})
封裝異步讀取文件操作
- fs.readFile()方法用于異步讀取文件(node核心模塊)
- 將Promise的實(shí)例對(duì)象作為函數(shù)的返回值返回
- 這樣函數(shù)執(zhí)行完畢后就得到一個(gè)Promise對(duì)象的實(shí)例,可以通過.then方法傳入成功的回調(diào)和失敗的回調(diào)
const fs = require('fs');
const path = require('path');function asyncGetFileByPath(p) {return new Promise((resolve, reject) => {// Promise對(duì)象里面的參數(shù),會(huì)立即執(zhí)行(前面說過)fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {if (err) {reject(err);} else {resolve(data);}})})
}
asyncGetFileByPath('./files/1.txt').then((data) => { // 成功的回調(diào)console.log(data);},(err) => { // 失敗的回調(diào)console.error(err);})
解決回調(diào)地獄
- 前面已經(jīng)成功的封裝了一個(gè)讀取文件的函數(shù)
- 下面用它來體驗(yàn)一下讀取多個(gè)文件
- 我們?cè)?then()方法中,第一個(gè)參數(shù)resolve()方法中,返回一個(gè)promise對(duì)象B.
- 那么在執(zhí)行.then()的resolve()方法完畢后,此時(shí)的執(zhí)行環(huán)境是這個(gè)Promise的實(shí)例b
- 可以通過b的.then()方法繼續(xù)傳入resolve取消回調(diào)地獄,讓代碼趨于扁平化
const fs = require('fs');
const path = require('path');function asyncGetFileByPath(p) {return new Promise((resolve, reject) => {// Promise對(duì)象里面的參數(shù),會(huì)立即執(zhí)行(前面說過)fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {if (err) {reject(err);} else {resolve(data);}})})
}
asyncGetFileByPath('./files/1.txt').then((data) => { // 成功的回調(diào) '1.txt'console.log(data); // 打印出 1.txt 數(shù)據(jù)return asyncGetFileByPath('./files/2.txt')},(err) => { // 失敗的回調(diào)console.error(err);}).then( // 成功的回調(diào) '2.txt'(data) => {console.log(data); // 打印出 2.txt 中的數(shù)據(jù)return asyncGetFileByPath('./files/3.txt') // 繼續(xù)返回Promise對(duì)象的實(shí)例},(err) => {console.error(err);}).then((data) => { // 成功的回調(diào) '3.txt'console.log(data); // 打印出 3.txt 中的數(shù)據(jù)},(err) => {console.error(err);})
總結(jié)
以上是生活随笔為你收集整理的es6 --- Promise封装读取文件操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。