需求: 封装一个根据文件名读取文件内容的方法,然后依次读取三个文件
const fs = require('fs');
const path = require('path');
function getFileByPath(path, succCallback, failCallback) {
fs.readFile(path, 'utf-8', (err, data) => {
if (err) {
return failCallback(err.message);
}
succCallback(data);
});
}
getFileByPath(path.join(__dirname, './1.txt'), function(data) {
console.log(data);
getFileByPath(path.join(__dirname, './2.txt'), function(data) {
console.log(data);
getFileByPath(path.join(__dirname, './3.txt'), function(data) {
console.log(data);
});
});
});
问题,回调嵌套太深,回调地狱
使用 es6
中的 Promise
来解决问题
- Promise 是一个构造函数,新建的实例代表一个异步操作,实例化时构造函数接收一个函数作为参数,函数中写你要做的异步操作,函数有两个参数,
resolve
(异步操作成功时执行)和reject
(异步操作失败时执行) ,这两个函数在实例.then()
中去定义
let promise = new Promise(function(resolve, reject) {
fs.readFile(path.join(__dirname, './11.txt'), 'utf-8', (err, data) => {
if (err) {
return reject(err);
}
resolve(data);
});
});
promise.then(function(data) {
console.log('resolve:' + data);
}, function(err) {
console.log('reject:' + err.message);
});
注意:在实例 promise 对象时,传入函数中的异步操作代码会立刻开始执行
- 如果我们在
对象.then
中返回一个promise对象,就可以一直使用.then
方法完成我们的需求
function getFileByPath(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
if (err) {
return reject(err);
}
resolve(data);
});
});
}
getFileByPath(path.join(__dirname, './1.txt'))
.then(function(data) {
console.log(data);
return getFileByPath(path.join(__dirname, './2.txt'));
}).then(function(data) {
console.log(data);
return getFileByPath(path.join(__dirname, './3.txt'));
}).then(function(data) {
console.log(data);
}).catch(function(err) {
console.log(err.message);
});