内容
1. Promise 介绍
1.1 Promise是什么?
抽象表达:
- Promise是一门新的技术(ES6规范)
- Promise是js中进行异步编程的新解决方案
(旧解决方案是单纯使用回调函数)
具体表达:
- 从语法上来说:Promise是一个
构造函数
,可以进行对象实例化
- 从功能上来说:Promise对象可以用来封装一个
异步操作
,并可以获取其成功或失败的结果值
(异步编程): 旧解决方案是单纯使用回调函数
fs 文件操作
require('fs').readFile('./index.html', (err,data) => {})
数据库操作
AJAX
$.get('/server', data => {})
定时器
setTimeout(() => {}, 2000)
1.2 为什么要使用Promise?
1.2.1 支持链式调用,可以解决回调地狱问题(这点很重要)
什么是回调地狱?
- 回调函数
嵌套
调用,外部
回调函数异步执行的结果
是嵌套
的回调执行的条件
asyncFunc1(op, (...args1) => {
asyncFunc2(op, (...args2) => {
asyncFunc3(op, (...args3) => {
asyncFunc4(op, (...args4) => {
// some operation
})
})
})
})
回调地狱的缺点?
- 不便于阅读
- 不便于错误处理
1.2.2 指定回调函数的方式更加灵活
- 旧的:必须在启动异步任务前指定
- promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定多个)
2. Promise 体验
一个抽奖小游戏
先用单纯用定时器实现:
下面来尝试用promise
实现:
Promise()
实例化接收一个参数,是函数类型- 这个函数有两个形参,
resolve
和reject
,也都是函数类型 - 当异步任务
成功
时调用resolve()
,异步任务失败
时调用reject()
resolve()
调完之后会将promise
对象的状态设置为成功
,reject()
调完之后会将promise
对象的状态设置为失败
then
方法的调用:它有两个参数,都是函数类型- 第一个参数是对象
成功
时的回调
,第二个参数是对象失败
时的回调
再加一个小需求,把那个生成的随机数一起alert出来:
上面介绍到:promise
对象除了封装异步操作
以外,还可以获取
其成功或失败
的结果值
我们在这里可以把那个生成的随机数num
当成是结果值,将它传给resolve()
和reject()
- 我们在成功的时候会调用
resolve()
,可以把成功的结果传给resolve()
函数,失败的结果传给reject()
函数 - 等到了
then()
方法里面,就可以拿到并处理成功和失败的结果
3. Promise 练习使用
3.1 fs读取文件
用promise
改写:
成功的时候调用resolve()
,失败的时候调用reject()
,并将成功和失败的结果分别传进去,在then()
方法中再分别处理
3.2 AJAX请求
用promise
改写:
成功的时候调用resolve()
,失败的时候调用reject()
,并将成功和失败的结果分别传进去,在then()
方法中再分别处理
4. Promise 练习封装
4.1 封装fs读取文件操作
- 封装一个函数:
mineReadFile
,来读取文件内容 - 参数:
path
,为文件路径 - 返回值:
promise
对象
调用的时候可以接then
方法,因为返回值就是一个promise
对象
4.2 封装AJAX发送get请求
- 封装一个函数:
sendAJAX
,发送 GET ajax请求 - 参数:
url
- 返回值:
promise
对象
调用:
5. Promise对象的状态属性介绍
Promise
的状态
指的是其实例对象中的一个属性:PromiseState
有三种可能值:
pending
:未决定的resolved
\fulfilled
:成功rejected
:失败
状态的改变只有两种可能:
pending
=>resolved
pending
=>rejected
而且promise
对象只能改变一次,无论变为成功还是失败,都会有一个结果值
成功的结果数据一般称为value
,失败的结果数据一般称为reason
6. Promise对象的结果属性介绍
实例对象中的另一个属性:PromiseResult
保存着异步任务成功
或失败
的结果
只有resolve()
和reject()
才能修改这个属性值
7. Promise的工作流程
- 首先通过
new Promise()
创建一个对象,在promise
内部封装异步操作 - 如果异步操作成功,则调用
resolve()
函数
resolve()
函数一旦被调用,则将promise
对象状态改为resolved
成功 - 状态为成功时,调用
then()
方法就会调用其第一个参数 then()
方法的返回结果是一个新的promise
对象