在Promise基础中,使用async await可以从语法层面去掉回调,async和await该怎么使用
基本概念
- async + 函数
async 函数
的返回值是promise对象,promise对象的结果由函数的执行结果决定 - await + 表达式
1、表达式一般是promise对象,也可以是其他值
2、如果表达式是promise对象,await 表达式
返回的是promise成功的值。如果是其他表达式,await 表达式
返回表达式本身的结果。
async 举个例子
<script>
async function fn1(){
return 1
}
const result = fn1()
result.then(
value => {
console.log('成功的回调,值为:',value)
},
reason => {
console.log('失败的回调,值为:',reason)
}
)
</script>
async function fn1()
async 函数的返回值是promise对象,promise对象的结果由函数的执行结果return 1
决定,这里promise对象的结果是成功
async 函数
语法可以理解为在用promise做了层封装再返回,上面的代码可以写成这样,更加方便理解:
async function fn1(){
return Promise.resolve(1)
}
这里立刻返回一个状态为成功的promise对象,也可以延迟返回:
async function fn1(){
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve(1)
},3000)
})
}
上面三种方式promise对象的结果都是成功,也可以设置为失败:
async function fn1(){
throw 2
}
async function fn1(){
return Promise.reject(2)
}
return new Promise((resolve,reject) => {
setTimeout(() => {
reject(2)
},3000)
})
await 举个例子
- 表达式返回一个promise对象
<script>
function fn1(){
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve(1)
},3000)
})
}
async function fn2(){
const value = await fn1()
console.log('成功的值',value)
}
fn2()
</script>
await 等待fn1()返回的promise对象的结果变为成功,直接获取到成功的值。
这样就不需要用promise对象.then()再设置成功回调去取值了。
await必须写在async函数内,await只能获取成功的结果
如果fn1返回一个失败的promise该怎么处理?
<script>
function fn1(){
return new Promise((resolve,reject) => {
setTimeout(() => {
reject(1)
},3000)
})
}
async function fn2(){
try{
const value = await fn1()
console.log('成功的值',value)
}catch(error){
console.log('失败的值',error)
}
}
fn2()
</script>
>>>失败的值 1
再看一个返回promise对象的例子:
<script>
async function fn1(){
return 1
}
async function fn2(){
try{
const value = await fn1()
console.log('成功的值',value)
}catch(error){
console.log('失败的值',error)
}
}
fn2()
</script>
>>>成功的值 1
这里输出1,不是因为fn1()中return 1
,而是因为fn1()
使用async
修饰,返回一个promise对象,这个promise对象成功的结果是fn1()的执行结果,即1
-
普通表达式
如果是普通表达式,得到表达式本身的结果
await必须写在async函数内,async函数内不一定有await
<script>
async function fn1(){
return 1
}
async function fn2(){
const value = await fn1()
console.log('得到的值:',value)
}
fn2()
</script>
>>>得到的值 1
网友评论