回调地狱
形如一下代码, 异步函数不断嵌套导致代码可读性和可维护性大幅下降,这就是回调地狱
var fs = require('fs');
fs.readFile('./doc/text.txt', (error, data) => {
if (error)
throw console.log('读取文件失败', error);
console.log('读取文件成功', data);
fs.readFile('./doc/text1.txt', (error, data) => {
if (error)
throw console.log('读取文件失败', error);
console.log('读取文件成功', data);
fs.readFile('./doc/text2.txt', (error, data) => {
if (error)
throw console.log('读取文件失败', error);
console.log('读取文件成功', data);
fs.readFile('./doc/text3.txt', (error, data) => {
if (error)
throw console.log('读取文件失败', error);
console.log('读取文件成功', data);
})
})
})
})
Promise (解决回调地狱的方法)
promise 使传统的回调嵌套转化为回调链式, 优雅的解决了回调地狱造成的问题
var p = new Promise(function(resolve, reject) {});
var p1 = new Promise(function(resolve, reject) {});
var p2 = new Promise(function(resolve, reject) {});
p.then((data) => {
console.log('接收 resolve 的正常执行序列');
console.log('读取文件成功', data);
return p1;
})
.then((data) => {
console.log('接收 resolve 的正常执行序列');
console.log('读取文件成功', data);
return p2;
})
.then((data) => {
console.log('接收 resolve 的正常执行序列');
console.log('读取文件成功', data);
return p2;
})
.catch((error) => {
console.log('接收 reject 的异常执行序列');
console.log('读取文件失败', error);
})
.finally(() => {
console.log('最终执行')
})
promise 应用
用 promise 封装 readFile 和 writeFile
exports.pReadFile = function (fileUrl) {
return new Promise(function (resolve, reject) {
console.log('开始执行 promise 实例的回调, 最先执行');
// 异步函数
fs.readFile(fileUrl, (error, data) => {
if (error) reject(error);
else {
resolve(data.toString());
}
})
})
}
exports.pWriteFile = function (fileUrl, content) {
return new Promise(function (resolve, reject) {
console.log('开始执行 promise 实例的回调, 最先执行');
// 异步函数
fs.writeFile(fileUrl, content, (error) => {
if (error) reject(error);
else resolve(1);
})
})
}
调用
pReadFile('./doc/text1.txt')
.then((data) => {
console.log('读取文件成功!', data);
return pReadFile('./doc/text.txt');
})
.then((data) => {
console.log('读取文件成功!', data);
})
.catch((err) => {
console.log(typeof (err));
console.log('读取失败!', err);
})
.finally(() => {
console.log('最终执行')
})