Promise
Promise
- 必须传入一个参数作为promise的参数 这个函数在 new Peomise的时候就会执行
- 函数有 resolve 和 reject 两个形参
-
函数就相当于一个容器 可以将异步任务放到这里
-
将异步任务成功的结果传给 resolve 函数 将失败的信息传给reject 函数
使用语法:
let p = new Promise((resolve, reject) => {
// ... some code
if (/* 异步操作成功 */) {
resolve(value);
} else {
reject(error);
}
});
then
then方法接收以上函数类型的参数 只处理成功
then方法只接收一个参数 表示只接收resolve的值 失败的结果可以通过链式调用 catch方法捕获
p.then(
result => { /* 获取成功的结果 */ }
);
// 或者
p.then(
result => { /* 获取成功的结果 */ },
err => { /* 获取失败的结果 */ }
);
// 或者
p.then(
result => { /* 获取成功的结果 */ }
).catch(
err => { /* 获取失败的结果 */ }
);
Prominse中的同步异步
new Promise 和 new 其他对象一样 是同步任务
获取结果时 调用 resolve参数 触发 then方法时 是异步的
promise解决回调地狱
回调地狱
回调地狱是 函数一层嵌套一层就称为回调地狱
方法一
封装函数
import fs from 'fs';
const p = new Promise((resolve, reject) => {
fs.readFile('./data/1.txt', 'utf-8', function (err, data) {
// err === null ? resolve(data) : reject(err.message)
err ? reject(err.message) : resolve(data)
})
})
const p2 = new Promise((resolve, reject) => {
fs.readFile('./data/2.txt', 'utf-8', function (err, data) {
// err === null ? resolve(data) : reject(err.message)
err ? reject(err.message) : resolve(data)
})
})
const p3 = new Promise((resolve, reject) => {
fs.readFile('./data/3.txt', 'utf-8', function (err, data) {
// err === null ? resolve(data) : reject(err.message)
err ? reject(err.message) : resolve(data)
})
})
p.then(res => {
// 判断业务状态码是否为 0
console.log(res);
return p2
}).then(res => {
console.log(res);
return p3
}).then(res => {
console.log(res);
})
方法二
优化写法简写
resolve 成功的信息
reject 失败的信息
import fs from 'fs';
const play = (address) => {
return new Promise((resolve, reject) => {
fs.readFile(address, 'utf-8', function (err, data) {
// err === null ? resolve(data) : reject(err.message)
err ? reject(err.message) : resolve(data)
})
})
}
play('./data/1.txt').then(res => {
console.log(res)
return play('./data/2.txt')
}).then(res => {
console.log(res)
return play('./data/3.txt')
}).then(res => {
console.log(res)
})
方法三.
第三方then-fs 解决回调地狱
1. 需要终端命令下载第三方包
npm i then-fs
import thenFs from 'then-fs';
thenFs.readFile('./data/1.txt', 'utf-8').then(res => {
// 判断业务状态码是否为 0
console.log(res);
return thenFs.readFile('./data/2.txt', 'utf-8')
}).then(res => {
// 判断业务状态码是否为 0
console.log(res);
return thenFs.readFile('./data/3.txt', 'utf-8')
}).then(res => {
// 判断业务状态码是否为 0
console.log(res);
})