目录
(1)如果then所指定的回调返回的是非Promise值为a:
(2)如果then所指定的回调返回的是一个Promise实例p:
4.中断promise链的方法(返回一个状态为初始化pending状态的Promise实例)
二:ES7新增async(异步)和await(异步等待成功结果)更好的解决回调地狱
一:Promise相关
1.Promise的链式调用
Promise实例.then()返回的是一个【新的Promise实例】,它的值和状态由什么决定?
- 简单表达: 由then()所指定的回调函数执行的结果决定
- 详细表达:
(1)如果then所指定的回调返回的是非Promise值为a:
那么【新Promise实例】状态为:成功(fulfilled), 成功的value为a
(2)如果then所指定的回调返回的是一个Promise实例p:
那么【新Promise实例】的状态、值,都与p一致
(3)如果then所指定的回调抛出异常:
那么【新Promise实例】状态为rejected失败, reason为抛出的那个异常
2.演示回调地狱
请求1成功后执行请求2,,,
3.Promise的链式调用解决回调地狱
4.中断promise链的方法(返回一个状态为初始化pending状态的Promise实例)
5.catch错误穿透
二:ES7新增async(异步)和await(异步等待成功结果)更好的解决回调地狱
1. async修饰的函数
函数的返回值为promise对象
Promise实例的结果由async函数执行的返回值决定
2. await表达式
await右侧的表达式一般为Promise实例对象, 但也可以是其它的值
(1).如果表达式是Promise实例对象, await后的返回值是promise成功的值
(2).如果表达式是其它值, 直接将此值作为await的返回值
3. 注意:
await必须写在async函数中, 但async函数中可以没有await
如果await的Promise实例对象失败了, 就会抛出异常, 后面代码不会进行,需要通过try...catch来捕获处理
<script>
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('我成功了')
}, 1000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject('我失败了')
}, 3000)
})
let p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('我成功了')
}, 5000)
})
; (async () => {
try {
const result1 = await p1
console.log(result1)
const result2 = await p2
console.log(result2)
const result3 = await p3
console.log(result3)
} catch (error) {
console.log(`输出:' ${error} '的实例错了,到此结束了,后面不会再输出了`)
}
})()
// 两个括号是立即执行函数,不用额外调用
console.log('hi,我是同步的')
</script>