Promise:
- es6中為了解決回調地獄問題而產生的
Promise的參數
- Promise的參數是一個函數.
- 每個Promise在實例化時,都會立即執行參數里的函數
const p = new Promise(()=>{console.log(1);
})// 解釋了上面的第2條
Promise參數的參數
- Promise的參數(函數),默認有2個參數(resolve,reject).譯為:成功的回調、失敗的回調
- 每個Promise實例都可以通過.then方法傳入,成功的回調和失敗的回調
// 先假設拿到了數據
const p = new Promise((resolve,reject)=>{setTimeout(()=>{const data = 'async resolve data';resolve(data);},1000);
});// 使用異步得到的data,通過.then()方法傳入回調函數
p.then((data)=>{console.log(data);
})
封裝異步讀取文件操作
- fs.readFile()方法用于異步讀取文件(node核心模塊)
- 將Promise的實例對象作為函數的返回值返回
- 這樣函數執行完畢后就得到一個Promise對象的實例,可以通過.then方法傳入成功的回調和失敗的回調
const fs = require('fs');
const path = require('path');function asyncGetFileByPath(p) {return new Promise((resolve, reject) => {// Promise對象里面的參數,會立即執行(前面說過)fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {if (err) {reject(err);} else {resolve(data);}})})
}
asyncGetFileByPath('./files/1.txt').then((data) => { // 成功的回調console.log(data);},(err) => { // 失敗的回調console.error(err);})
解決回調地獄
- 前面已經成功的封裝了一個讀取文件的函數
- 下面用它來體驗一下讀取多個文件
- 我們在.then()方法中,第一個參數resolve()方法中,返回一個promise對象B.
- 那么在執行.then()的resolve()方法完畢后,此時的執行環境是這個Promise的實例b
- 可以通過b的.then()方法繼續傳入resolve取消回調地獄,讓代碼趨于扁平化
const fs = require('fs');
const path = require('path');function asyncGetFileByPath(p) {return new Promise((resolve, reject) => {// Promise對象里面的參數,會立即執行(前面說過)fs.readFile(path.join(__dirname, p), 'utf-8', (err, data) => {if (err) {reject(err);} else {resolve(data);}})})
}
asyncGetFileByPath('./files/1.txt').then((data) => { // 成功的回調 '1.txt'console.log(data); // 打印出 1.txt 數據return asyncGetFileByPath('./files/2.txt')},(err) => { // 失敗的回調console.error(err);}).then( // 成功的回調 '2.txt'(data) => {console.log(data); // 打印出 2.txt 中的數據return asyncGetFileByPath('./files/3.txt') // 繼續返回Promise對象的實例},(err) => {console.error(err);}).then((data) => { // 成功的回調 '3.txt'console.log(data); // 打印出 3.txt 中的數據},(err) => {console.error(err);})