在Node.js里有时候回因为回调函数调用过多,导致回掉地狱。 而使用Promise可以避免这个问题。
Promise概念:
Promise是ES6中新出现的一个东西,在ES6中就是一个对象。
Promise常常是一个容器,一般用来封装一个异步操作。
Promise使用:
1.Promise 对象有三种状态:Pending(正在处理),Resolved(成交,已解决),Rejected( 驳回,失败)。需要注意的是Promise对象一经创建,立刻执行。
2.Promise实例对象有一个方法:then 方法。
1) then需要传递两个回调处理函数:
其中第一个回调处理函数就是promise对象内部的resolve函数;
第二个回调函数是可选的,如果传递就是promise对象内部的reject函数;
2)then 方法后可以继续链式调用then:
后续的每一个then中指定的回调函数都会被执行;
后续的then中指定的回掉函数可以接收上一个then中指定的成功的回调函数的返回结果:
a.没有返回值,默认是undefined
b.有普通的返回指,数字,字符串,对象,数组。。。
c.返回一个新的promise对象
3.Promise的异常处理:
在使用promise做异步处理的时候,关于异常的处理可以通过在最后一个then之后设置一个catch,然后指定一个失败处理函数。该函数可以捕获前面所有的promise对象本身一件then内部的任务错误。当前面任何一个发生异常,直接进如catch,后续所有的promise包括then不再执行。
Example #1:
const fs = require('fs');
new Promise((resolve, reject) => {
fs.readFile('./data/1.txt', (err, data) => {
if(err){
//当 promise对象内部的异步操作失败,告诉promise的对象容器,该异步任务失败了,其实就是将promise内部的pending改为rejected
reject(err);
}
//当代码执行到这里,说明该promise对象的内部的异步操作没有错误发生,证明成功了
//然后将promise的内部的pending状态改为resolved
resolve(data);
console.log("Here!");
})
})
.then((data) =>{
console.log("111");
console.log(data.toString());
return new Promise((resolve, reject) => {
fs.readFile('./data/2.txt', (err,data) => {
//这里没有使用return的原因是promise的状态只能从pending变为resolved 活着rejected, 状态一旦改变不会发生变话
if(err)
reject(err);
resolve(data);
})
});
},(err)=>{
console.log("Failed to read the file!");
})
.then((data)=>{
console.log("222");
console.log(data.toString());
return new Promise((resolve, reject) => {
fs.readFile('./data/3.txt', (err,data) => {
//这里没有使用return的原因是promise的状态只能从pending变为resolved 活着rejected, 状态一旦改变不会发生变话
if(err)
reject(err);
resolve(data);
})
});
})
.then((data)=>{
console.log("333");
console.log(data.toString());
})
Example #2:
const fs = require('fs');
readFile('./data/1.txt', 'utf8')
.then(data => {
console.log(data);
return readFile('./data/2.txt', 'utf8');
})
.then(data => {
console.log(data);
return readFile('./data/3.txt', 'utf8');
})
.then(data => {
console.log(data);
})
function readFile(...args) {
return new Promise((resolve, reject) => {
fs.readFile(...args, (err, data) =>{
if (err)
reject(err);
resolve(data);
})
})
}
Example #3:
const fs = require('fs');
readFile('./data/1.txt', 'utf8')
.then(data => {
console.log(data);
return readFile('./data/12.txt', 'utf8');
})
.then(data => {
console.log(data);
JSON.parse('ss');
return readFile('./data/3.txt', 'utf8');
})
.then(data => {
console.log(data);
})
.catch(err => {
console.log(err);
})
function readFile(...args) {
return new Promise((resolve, reject) => {
fs.readFile(...args, (err, data) =>{
if (err)
reject(err);
resolve(data);
})
})
}
From: BiliBili 《node-全栈项目》17,18,19,21集