1.Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和时间更加合理且强大。
2.特点:
(1)对象的状态不受外界影响(3种状态)
[1]Pending状态(进行中)
[2]Fulfilled状态(已成功)
[3]Rejected状态(已失败)
(2)一旦状态改变就不会再变(两种状态的改变:成功、失败)
[1]Pending——>Fulfilled
[2]Pend——>Rejected
(3)可以把Promise看成一个状态机,初始是Pending状态,可以通过函数resolve和reject,将状态转变为Fulfilled或者Rejected状态。状态一旦改变,就不能再次改变。
3.Promise实例
(1)例子:
var promise = new Promise(function(resolve,reject){
//...some code
if(/*异步操作成功*/){
resolve(value)
}else{
reject(error)
}
})
(2)Promise构造函数接收一个函数作为参数,该函数的两个参数分别为resolve和reject。它们是两个函数。由JavaScript引擎提供,不用自己部署。
[1]resolve作用是将Promise对象状态由”未完成“变为”成功“,也就是Pending——>Fulfilled,在异步操作成功时调用,并将异步操作的结果作为参数传递出去。
[2]reject函数是将Promise对象状态由"未完成"变为"失败",也就是Pending——>Rejected,在异步操作失败时调用,并将异步操作的结果传递出去。
4.Promise的then函数:Promise实例生成后,可用then方法分别指定两种状态回调函数。then方法可以接受两个回调函数作为参数。
(1)Promise对象状态改为Rejected时调用(必选)
(2)Promise对象状态改为Rejected时调用(可选)
5.then函数的基本用法实例
function sleep(ms){
return new Promise(function(resolve,reject){
setTimeout(resolve,ms)
})
}
sleep(50).then(()=>console.log("finished"))
这段代码定义了一个sleep函数,调用后,等待50ms后执行then函数中的内容。
6.与定时器混用后的执行顺序
let promise = new Promise(function(resolve.reject){
console.log("1")
resolve()
})
setTimeout(()=>console.log("2"),0);
promise.then(()=>console.log("3"));
console.log("4")
分析:
(1)顺序为1—>4—>3—>2
(2)主要讨论2和3的顺序问题:Promise属于JavaScript引擎内部任务;SetTimeout是浏览器API;引擎内部任务的优先级高于浏览器的API