Promise 的基本使用
为了解决回调地狱问题,从而给出的解决办法:
/**
* Promise
*
* 1. Promise 是 一个构造函数 new Vue()
* 2. Promise() 里面有个参数, 参数就是一个回调 () => {}
* 回调也有参数
* resolve f 操作成功的时候调用resolve => 调用 resolve => then()
* reject f 操作失败的时候调用reject
* 3. 在 Promise里面放一个异步操作
/**
* 1. p 什么类型 Promise类型
* 2. axios.get() Promise 类型
* 3. axios.get().then()
* 4. p.then()
* xxxx.then() xxxx 大多数就是个promise
*/
const p = new Promise((resolve, reject) => {
console.log('准备开始执行异步操作了')
// 举例 : 来一个异步操作
setTimeout(() => {
// 假如操作成功了 成功 == resolve == then
// resolve('成功了')
// 假如操作失败了 失败 == reject == catch
reject('失败了')
}, 1000)
})
p.then(res => {
console.log('走then了', res)
}).catch(err => {
console.log('走catch了', err)
})
// axios.get().then()
读取多个文件时可以使用:
ml_read('./a.txt')
.then(res => {
console.log('a', res)
return ml_read('./b.txt')
})
.then(res => {
console.log('b', res)
return ml_read('./c.txt')
})
.then(res => {
console.log('c', res)
})
async … await … 的使用
let fs = require('fs')
/**
* @name ml_read
* @desc 读取多个文件
* @param
* @return
*/
function ml_read(path) {
//1. 创建 promise 实例
let p = new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
if (err) {
return reject('错误了')
}
resolve(data)
})
})
//2. 返回 这个 promise 实例
return p
}
// **************************** 上面是封装好的 promise 函数 ml_read ***********
/**
* async 和 await 是 es8 提出来的
* 作用 : 一种(编写同步代码的方式)处理异步的解决方案 , 处理的更加彻底
*
* async 修饰一个(内部有await)函数 async function test() { }
* await 修饰一个promise, 等待一个promise的结果 await promise类型
*/
async function test() {
// then 其实就是等待一个结果(res)
// ml_read('./a.txt').then(res => {
// console.log(res)
// })
// await 其实也是等待一个结果(res)
let resa = await ml_read('./a.txt')
console.log(resa)
let resb = await ml_read('./b.txt')
console.log(resb)
let resc = await ml_read('./c.txt')
console.log(resc)
}
test()
/**
* 使用了
* 需求 : a => b => c
*/
// ml_read('./a.txt')
// .then(res => {
// console.log('a', res)
// return ml_read('./b.txt')
// })
// .then(res => {
// console.log('b', res)
// return ml_read('./c.txt')
// })
// .then(res => {
// console.log('c', res)
// })
注意点及 try … catch … 的使用:
- 1.async 和 await 要成对出现
* 缺少async : SyntaxError: await is only valid in async function
* 缺少await : 打印的就是 promise 类型
* 2. 如何处理 async 和 await 的异常情况
* try…catch() 如果没有问题 => 跳过 catch, 如果有问题就会被catch 捕获
* 3. async 就近原则, async 添加到 await最近的函数前面 (小心回调)
三种状态:
Promise的三种状态
* pending 待定
* fulfilled 完成 <== resolve() 成功
* rejected 拒绝 <== reject() 失败
测试:对Ajax
进行Jquery
封装
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body>
<script src="./node_modules/jquery/dist/jquery.js"></script>
<script>
//http://localhost:3000
// $.ajax({
// // 类型
// type: 'get',
// // 接口
// url: 'http://127.0.0.1:3000/post?pageIndex=1&pageSize=2&category=8',
// // 参数
// data: {},
// // 数据返回类型
// dataType: 'json',
// // 成功
// success: res => {
// console.log('成功', res)
// },
// // 失败
// error: err => {
// console.log('失败', err)
// },
// })
// 'http://127.0.0.1:3000/post?pageIndex=1&pageSize=2&category=8'
// 自己手写三遍
function ml_ajax(options) {
// 1. 创建 promise 实例
let p = new Promise((resolve, reject) => {
$.ajax({
// 类型
type: options.method || 'get',
// 接口
url: options.url,
// 参数
data: options.data || {},
// 数据返回类型
dataType: 'json',
// 成功
success: res => {
// console.log('成功', res)
resolve(res)
},
// 失败
error: err => {
// console.log('失败', err)
reject(err)
},
})
})
// 2. 返回promise 实例
return p
}
let url = 'http://127.0.0.1:3000/post?pageIndex=1&pageSize=2&category=8'
ml_ajax({
url,
}).then(res => {
console.log('666', res)
})
</script>
</body>
</html>