Promise是一个构造函数,用于创建Promise对象
Promise主要用于解决回调地狱的问题
Promise出现原因(可以解决什么)
回调地狱:异步回调 层层嵌套
代码理解:
const fs = require('fs')
fs.readFile(`${__dirname}/data/a.txt`,'utf8',(err,data)=>{
if(err){
throw err
}else{
console.log(data);
fs.readFile(`${__dirname}/data/b.txt`,'utf8',(err,data)=>{
if(err){
throw err
}else{
console.log(data);
fs.readFile(`${__dirname}/data/c.txt`,'utf8',(err,data)=>{
if(err){
throw err
}else{
console.log(data);
fs.readFile(`${__dirname}/data/d.txt`,'utf8',(err,data)=>{
if(err){
throw err
}else{
console.log(data);
}
})
}
})
}
})
}
})
使用Promise
1.实例化Promise对象
作用: 将异步操作代码 放入 Promise中
resolve:异步操作 成功状态
reject : 异步操作 失败状态
new Promise((resolve,reject)=>{ 你的异步操作 })
2.调用then()
方法处理异步操作结果
promise对象.then((data)=>{ 处理成功数据 },(err)=>{ 处理失败信息 });
代码展示具体写法:
const fs = require('fs')
let p = new Promise((resolve,reject)=>{
fs.readFile(`${__dirname}/data/a.txt`,'utf-8',(err,data)=>{
if(err){
resolve(err)
}else{
reject(data)
}
})
})
p.then(res=>{
console.log(res);
},err=>{
console.log(err);
})
Promise原理
Promise本质只是一个容器,它无法控制异步代码执行,Promise.then才是异步
1.promise对象有三个状态.
a. pending(进行中)
b. fulfilled(已成功)
c. rejected(已失败)
2.Promise对象的状态改变, 只有两种可能:
a. 从pending变为fulfilled
* 此时应该执行 resolve();
b. 从pending变为rejected。
* 此时应该执行 reject();
3.promise在创建对象的时候,里面的代码会立即执行.
a. promise创建时,里面的代码还是异步无序操作
b. promise的原理是,利用then方法将异步操作的结果 按照顺序执行
*** 总结: 不要在创建promise的时候去处理异步操作结果,而应该通过 then() 方法来处理 ***
Promise解决回调地狱封装
const fs = require('fs');
//1.封装一个函数 : 根据文件名生成 文件读取的promise
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;
};
//2.解决需求: 要先读a, 读完a后读b, 读完b后读c.
//开始读取a
getPromise('a').then((data)=>{
console.log(data);
//继续读取b
return getPromise('b');
}).then((data)=>{
console.log(data);
//继续读取c
return getPromise('c');
}).then((data)=>{
console.log(data);
});//异步回调队列结束
ES6异步函数async与await
异步函数async相当于是promise语法的 “高级写法”
async和await异步函数 : 这两个关键字只能用于函数, 所以用的时候一定要放在函数里面用
async关键字: 修饰函数。 表示这个函数内部有异步操作。
await关键字: 等待异步执行完毕。
(1)await只能用于被async修饰的函数中。
只有当await后面的异步操作执行完毕后,才会继续执行后面代码
(2)await 后面 只能是promise对象
const fs = require("fs");
/*
promise实例对象的catch方法 : 用于捕获异步操作的错误信息
*/
//1.封装一个函数 : 根据文件名生成 文件读取的promise
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;
};
//2.解决需求: 要先读a, 读完a后读b, 读完b后读c.
const readFile = async () => {
let data1 = await getPromise('a')
console.log(data1)
let data2 = await getPromise('b')
console.log(data2)
//async异步函数的错误信息要用try-catch来捕捉
try {
let data3 = await getPromise('c')
console.log(data3)
} catch (err) {
console.log(err)
}
}
readFile()
axios原理其实就是Promise,有时间继续补充...