-
Primse的状态 实例对象中一个属性【PromisState】
* pending 未决定 * resolved / fullfilled 成功 * rejected 失败
Primse的状态改变
1、pending 变为 resolved
2、pending 变为 reject
说明:只有这 2 中,且一个 promise对象只能改变一次
无论变为成功还是失败,都会有一个结果数据
成功的结果数据一般称为 value,失败的结果数据一般称为 reason
2. Primse 对象的值 实例对象中的另一个属性 【PromiseResult】
保存着异步任务【成功 / 失败】的结果
* resolve
* reject
3. Promise的API 1、Promise构造函数:Promise(excutor){}
(1)、excutor 函数:执行器(resolve,reject)=>{}
(2)、resolve 函数:内部定义成功时,我们调用的函数 value=>{}
(3)、reject 函数:内部定义失败时,我们调用的函数 reason=>{}
说明:excutor 会在 Promise 内部立即同步调用,异步操作在执行器中执行
2、Promise.prototype.then 方法:(onResolved,onRejected)=>{}
(1)、onResolved 函数:成功的回调函数(value) =>{}
(2)、onRejected 函数:失败的回调函数 (reason)=>{}
说明:指定用于得到成功 value的成功回调和用于得到失败reason的失败回调,返回一个新的 Promise对象
3、Promise.prototype.catch 方法:(onReject) =>{}
(1)、onRejected 函数:失败的回调函数 (reason)=>{}
4、Promise.resolve 方法 :(value)=>{}
(1)、value:成功的结果
说明:返回一个成功的 Promise对象
5、Promise.reject 方法:(reason)=>{}
(1)、reason:失败的原因
说明:返回的是一个失败的 Promise对象
6、Promise.all 方法:(promises)=>{}
(1)、promises:包含 n 个promise的数组
说明:返回一个新的 promise,只有所有的 promise都成功才成功,只要有一个失败了就直接失败
7、Promise.race 方法:(promises)=>{}
(1)、promises:包含 n 个promise的数组
说明:返回一个新的 promise,第一个完成的 promise 的结果状态就是最终的结果状态
4. Promise 的关键问题
1、如何改变 promise的状态?
(1)、resolve(value):如果当前是 pending 就会变为 resolved
(2)、reject(reason):如果当前是 pending 就会变为 rejected
(3)、抛出异常(throw):如果当前是 pending 就会变为 rejected
2、一个 promise 指定多个成功 / 失败回调函数,都会调用码?
当前 promise 改变为 对应状态时都会用调用
3、改变 promise状态和指定回调函数谁先谁后?
(1)、都有可能,正常情况下是:先指定回调在改变状态,但也可以先改变状态在指定回调
(2)、如何先改变状态指定回调?
①、在执行器中直接调用 resolved() / reject()
②、延迟更长事件才调用 then()
(3)、什么时候才能的到数据?
①、如果先指定的回调,那当状态发生改变时,回调函数就会调用得到数据
②、如果先改变的状态,那当指定回调时,回调函数就会调用,得到数据
4、promise.then() 返回的新 promise的结果状态有什么决定?
(1)、简单表达:由 then()指定的回调函数指定的结果决定
(2)、详细表达:
①、如果抛出异常(throw),新 promise 变为 rejected,reason为抛出异常
②、如果返回的是 非promise 的任意值,新promise 变为 resolved,value为返回的值
③、如果返回的是另一个新promise,此 promise的结果就会成为 新promise的结果
5、Promise 如何串连多个操作任务
(1)、promise 的 then()返回一个新的 promise,可以开成 then()的链式调用
(2)、通过 then() 的链式调用串连多个 同步 / 异步 任务
6、Promise 异常传透
(1)、当使用 promise 的 then() 链式调用时,可以在最后指定失败的回调
(2)、前面任何操作出了异常,都会传到最后失败的回调中处理
7、中断 promise 链?
(1)、当使用 promise 的 then()链式调用时,在中间中断,不在调用后面的回调函数
(2)、办法(有且只有一个):在回调函数中返回一个 pending 状态的 promise 对象
5. async 函数
(1)、函数的返回值为 promise对象
(2)、promise 对象的结果由 async 函数执行的返回值决定
###await 表达式
1、await 右侧的表达式一般为 promise 对象,但也可以是其他的值
2、如果表达式是 promise对象,await 返回的是 promise 成功的值
3、如果表达式是其他值,直接将此值作为 await 的返回值
注意:1、await 必须写在 async 函数中,但 async 函数中可以没有await
2、如果 await 的 promise 失败了,就会抛出异常,需要通过 try....catch 捕获处理