最佳实践:
执行器函数内部一定要有异步逻辑 而且我们得让执行器决定的那个promise的状态与当前的异步逻辑挂钩!
then对应的回调中 一般都是要返回promise的! 这个promise一般也会和一个异步逻辑挂钩!
一定要让await等一个promise!!!!!!
1.
promise本质上是一个构造函数(其构造出来的实例是一个状态机;具备三个状态:初始化 成功 失败)
promise是用来解决回调地狱的(为异步编程提供更优质的解决方案)
2.
promise的第一个参数 我们称为执行器! 执行器是一个同步的回调函数!!!
执行器的执行过程! 决定了返回的promise的状态!
执行器的返回值会被忽略
3.
var p = new Promise((resolve, reject)=>{
//拿setTimeout模拟ajax请求
setTimeout((flag)=>{
if(flag){
//异步操作成功
resolve()
}else {
//异步操作失败
reject()
}
},1000,true)
});
执行器的执行过程! 决定了返回的promise的状态!
如果执行器什么操作都没有做 则返回初始化状态的promise 该promise持有的值是undefined
如果执行器的第一个参数resolve被调用 则返回成功状态的promise 该promise持有的值是resolve的第一个参数
如果执行器的第二个参数reject被调用 则返回失败状态的promise 该promise持有的值是reject的第一个参数
如果执行器在执行时出错! 则返回失败状态的promise 该promise持有的值是失败原因(错误对象)
一个promise实例状态只能改变一次!! 所以promise都是一次性的!!!
正常情况下 then方法先调用,p的状态再确定。
4.then
var p = new Promise((resolve, reject)=>{
//第一次请求
setTimeout((flag)=>{
if(flag){
console.log("获取1号视频成功")
resolve(1)
}
},1000,true)
});
then的回调返回了一个值,那么then返回的Promise将会成为成功状态,并且将返回的值作为自己持有的值
then的回调抛出一个错误,那么then返回的Promise将会成为拒绝状态,并且将抛出的错误作为自己持有的值
then的回调返回什么样的promise,那么then返回的Promise将会成为对应的promise
5.解决外部异常
非promise:try{}catch(err){}
promise:catch{}
6.async
async函数返回了一个值,那么async函数返回的Promise将会成为成功状态,并且将返回的值作为自己持有的值
async函数抛出一个错误,那么async函数返回的Promise将会成为拒绝状态,并且将抛出的错误作为自己持有的值
async函数返回什么样的promise,那么返回的Promise将会成为对应的promise
7.async函数的嵌套
async function a() {
await new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log("a-1");
resolve()
},1000)
})
await new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log("a-2");
resolve()
},1000)
})
await new Promise((resolve, reject)=>{
setTimeout(()=>{
console.log("a-3");
resolve()
},1000)
})
}
(async ()=>{
await a()
console.log("a-4")
})()