如果我们要按顺序输出a.txt,b.txt,c.txt,就需要回调嵌套,就会产生回调地狱 callback hell
fs.readFile('a.txt', 'utf8', function (err, data) {
if (err) {
throw err
}
console.log(data)
fs.readFile('b.txt', 'utf8', function (err, data) {
if (err) {
throw err
}
console.log(data)
fs.readFile('c.txt', 'utf8', function (err, data) {
if (err) {
throw err
}
console.log(data)
})
})
})
Promise就是用来解决回调地狱
Promise是一个容器,这个容器里存放了一个将来才可能结束的异步任务
// 创建Promise容器,Promise容器一旦创建,就开始执行里面的代码
// Promise本身不是异步的,里面的任务是异步的
// 开始执行是状态为pending,只能变为两种状态中的一种,resolve:成功,reject:失败
let p1 = new Promise(function (resolve, reject) {
fs.readFile('a.txt', 'utf8', function (err, data) {
if (err) {
//把容器的状态变为reject
reject(err)
}
resolve(data)
})
})
let p2 = new Promise(function (resolve, reject) {
fs.readFile('b.txt', 'utf8', function (err, data) {
if (err) {
//把容器的状态变为reject
reject(err)
}
resolve(data)
})
})
let p3 = new Promise(function (resolve, reject) {
fs.readFile('c.txt', 'utf8', function (err, data) {
if (err) {
//把容器的状态变为reject
reject(err)
}
resolve(data)
})
})
// 当p1成功了,然后(then)做指定的操作
// then方法接收的2个参数就是容器中的resolve函数和reject函数
// Promise对象.then后返回的还是一个Promise对象
p1
.then(function (data) {
console.log(data)
return p2
}, function (err) {
console.log(err)
})
.then(function (data) {
console.log(data)
return p3
})
.then(function () {
console.log(data)
})