文章目录
Promise简介
Promise 是一个对象,它代表了一个异步操作的最终完成或者失败。本质上 Promise 是一个函数返回的对象,我们可以在它上面绑定回调函数,这样我们就不需要在一开始把回调函数作为参数传入这个函数了。
约定
不同于“老式”的传入回调,在使用 Promise 时,会有以下约定:
- 在本轮事件循环运行完成之前,回调函数是不会被调用的。
- 即使异步操作已经完成(成功或失败),在这之后通过 then()添加的回调函数也会被调用。
- 通过多次调用 then() 可以添加多个回调函数,它们会按照插入顺序进行执行。
Promise 很棒的一点就是链式调用(chaining)。
Promise原理分析
Promise内部有三个状态:pending,fullfilled和rejected。
pending是对象创建后的初始状态,当对象fulfill(成功)时变为fulfilled,当对象reject(失败)时变为rejected。且只能从pengding变为fulfilled或rejected ,而不能逆向或从fulfilled变为rejected 、从rejected变为fulfilled。如图所示:
Promise实例方法介绍
Promise对象拥有两个实例方法then()和catch()。
then()方法
成功和失败的回调函数我们是通过then()添加,在promise状态改变时分别调用。promise构造函数中通常都是异步的,所以then方法往往都先于resolve和reject方法执行。所以promise内部需要有一个存储fulfill时调用函数的数组和一个存储reject时调用函数的数组。
then方法可以接收两个参数,且通常都是函数(非函数时如何处理下一篇文章中会详细介绍)。
第一个参数会添加到fulfill时调用的数组中,第二个参数添加到reject时调用的数组中。
当promise状态fulfill时,会把resolve(value)中的value值传给调用的函数中。
var p = new Promise(function(resolve, reject){
resolve(5)
}).then(function(value){
console.log(value) //5
})
同理,当promise状态reject时,会把reject(reason)中的reason值传给调用的函数。
var p1 = new Promise(function(resolve, reject){
reject(new Error('错误'))
}).then(function(value){