promise是node.js的对象,它是一个构造函数,作用是将异步操作以同步操作的流程表达出来。解决Node.js异步编程中回调地狱的问题。
语法:
const fs = require('fs');
//通过promise 能把 异步API的执行 和 正确/错误的处理 进行了分离 这样就能够解决回调地狱的问题
//resolve和reject实际上就是两个函数;如果下面异步API执行成功了就调用resolve,如果失败了就调用reject
//通过resolve和reject就可以把err和result的值拿到promise的外面
let promise = new Promise((resolve, reject) => {
fs.readFile('./1.txt', 'utf8', (err, result) => {
if (err != null) {
reject(err);
} else {
resolve(result);
}
});
});
//then下面的回调函数相当于调用了上面的resolve()函数;把上面的result实参传递给这里回调函数的形参
//catch下面的回调函数相当于调用了上面的reject()函数;把上面的err实参传递给这里回调函数的形参
promise.then((result) => {
console.log(result);
})
.catch((err) => {
console.log(err);
})
案例:
//需求:依次读取1.txt、2.txt、3.txt三个文件
const fs = require('fs');
//回调地狱代码(异步API嵌套问题)
// fs.readFile('./1.txt', 'utf8', (err, result1) => {
// console.log(result1);
// fs.readFile('./2.txt', 'utf8', (err, result2) => {
// console.log(result2);
// fs.readFile('./3.txt', 'utf8', (err, result3) => {
// console.log(result3);
// });
// });
// });
//下面是利用promise改造回调地狱的代码 解决了异步API嵌套的问题
//1.依次读取3个文件,也就是要调用三次fs.readFile(),由于fs.readFile()是异步API,所以我们可以用promise包装它
//2.为了控制API在适当的时机被执行,又在promise外面包裹一个函数 当函数被调用时return的就是这个promise对象
function p1() {
return new Promise((resolve, reject) => {
fs.readFile('./1.txt', 'utf8', (err, result) => {
resolve(result)
})
})
}
function p2() {
return new Promise((resolve, reject) => {
fs.readFile('./2.txt', 'utf8', (err, result) => {
resolve(result)
})
})
}
function p3() {
return new Promise((resolve, reject) => {
fs.readFile('./3.txt', 'utf8', (err, result) => {
resolve(result)
})
})
}
//3.由于promise给我们提供了链式编程的写法,如果想要在第二个then拿到r2的结果,只需在前面一个then 返回p2()的promise对象即可
p1().then((r1) => {
console.log(r1);
return p2();
})
.then((r2) => {
console.log(r2);
return p3();
})
.then((r3) => {
console.log(r3);
})