1.Promise介绍
1.1什么是Promise
1.2Promise的作用
const fs = require('fs');
fs.readFile("./data/a.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
};
});
fs.readFile("./data/b.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
};
});
fs.readFile("./data/c.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
};
});
fs.readFile("./data/a.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
fs.readFile("./data/b.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
fs.readFile("./data/c.txt", 'utf-8', (err, data) => {
if(err){
console.log(err);
}else{
console.log(data);
}
});
}
});
}
});
2.Promise的基本使用
2.1.实例化Promise对象
• 将异步代码放到Promise中
• resolve 异步代码 正确状态
• reject 异步代码失败状态(resolve和reject是回调函数)
new Promise((resolve,reject)=>{你的异步操作})
2.2. 调用then方法处理异步操作的结果
• Promise实例对象.then(res=>{处理成功结果},err=>{处理失败结果})
• 或 Promise实例对象.then(res=>{处理成功结果}).catch(err=>{处理失败结果})
推荐第二种写法
const fs = require('fs');
const p1 = new Promise((resolve,reject)=>{
fs.readFile('./data/a.txt','utf8',(err,data)=>{
if(err == null){
resolve(data);
}else {
reject(err);
}
});
});
p1.then((data)=>{
console.log(data);
},(err)=>{
console.log(err);
});
3.Promise特点介绍(原理篇)
promise本质 `不是控制` 异步代码的`执行顺序`(无法控制) , `而是控制`异步代码结果`处理的顺序`
promise本身只是一个"容器",真正异步的是它的两个回调resolve()和reject()。
3.1.Promise对象有三个状态
a.pending(进行时)
b.fulfilled(已成功)
c.rejected(已失败)
3.2. Promise改变状态只有两种可能
a.pending变成fulilled
*此时执行resolve
b.pending变成rejected
*此时执行reject
3.3. Promise在创建对象的时候,里面的代码会立即执行
(1)不要在Promise里面处理异步结果
(2)而是将结果交给resolve和reject,然后让then()来处理异步结果
总结: 不要在创建promise的时候去处理异步操作结果,而应该通过 then() 方法来处理
3.4. promise解决回调地狱的原理
在promise的then方法中,返回下一个promise
总结: promise的本质不是控制异步代码的执行顺序(无法控制),而是控制异步代码处理结果的顺序。
const fs = require('fs');
const p1 = new Promise((resolve,reject)=>{
fs.readFile('./data/a.txt','utf8',(err,data)=>{
if(err == null){
resolve(data);
}else {
reject(err);
}
});
});
const p2 = new Promise((resolve,reject)=>{
fs.readFile('./data/b.txt','utf8',(err,data)=>{
if(err == null){
resolve(data);
}else {
reject(err);
}
});
});
const p3 = new Promise((resolve,reject)=>{
fs.readFile('./data/c.txt','utf8',(err,data)=>{
if(err == null){
resolve(data);
}else {
reject(err);
}
});
});
p1.then((data)=>{
console.log(data);
return p2;
}).then((data)=>{
console.log(data);
return p3;
}).then((data)=>{
console.log(data);
});
4. Promise解决回调地狱封装
const fs = require('fs');
function getPromise(fileName) {
let p = new Promise((resolve, reject) => {
fs.readFile(`./data/${fileName}.txt`,'utf-8', (err, data) => {
if (err == null) {
resolve(data);
} else {
reject(err);
}
});
});
return p;
};
getPromise('a').then((data)=>{
console.log(data);
return getPromise('b');
}).then((data)=>{
console.log(data);
return getPromise('c');
}).then((data)=>{
console.log(data);
});
5. Promise对象的all方法
● 作用: 将所以的Promise合成一个Promise
● 所以异步执行完毕才会执行then方法
● 参数是一个数组,数组里是每一个Promise实例对象[p1,p2,p3],处理后的结果也是数组中的顺序。
6. Promise对象的race方法
1. promise实例对象的race方法:将多个Promise合并成一个Promise
* 任何一个异步 执行完毕就会执行then方法
2. 解决需求: a , b , c 任意一个成功