es6学习之async和await关键字
await关键字
await关键字只能在async函数中使用,如果再没有async的函数中使用就会报错。
- await关键字会暂停当前async函数的执行,等待promise处置完成。
- 如果promise正常处理则会返回promise中的resolve的值。
- 如果处理失败会把promise的异常原因抛出。
- 如果await操作符的表达
- +式不是一个promise.则返回该值的本身。
async function demo1() {
let reslut = await Promise.resolve('处理成功!')
return reslut;
}
async function demo2() {
try {
let reslut = await Promise.reject('处理失败!')
return reslut;
} catch (e) {
console.log("e:" + e);
return e;
}
}
async function demo3() {
let reslut = await "返回正常值";
return reslut;
}
demo1().then((val) => {
console.log("demo1" + val)
});
demo2().then((val) => {
console.log("demo2" + val)
});
demo3().then((val) => {
console.log("demo3" + val)
});
// 打印出:
// e:处理失败!
// demo1处理成功!
// demo2处理失败!
// demo3返回正常值
async 函数
async 函数是使用async
关键字声明的函数,并且其中允许使用await
关键字。async
和await
关键字让我们可以用一种更简洁的方式写出基于Promise
的异步行为,而无需刻意地链式调用promise
。说白了就是promise的另一种使用形式。
- async 函数一定会返回一个 promise 对象。如果一个 async 函数的返回值看起来不是 promise,那么它将会被隐式地包装在一个 promise 中。
async function demo(){ return 1; } async function demo1(){ return Promise.resolve(1); } demo().then((val)=>{ console.log('demo:'+val) }) demo1().then((val)=>{ console.log('demo1:'+val) }) // demo和demo1函数返回的数值一样
- 在async函数中可能会包含0到多个的await 表达式。以下打印的顺序是过两秒之后打印1再过两秒之后打印2之后是‘33333’。
async function foo() {
const result1 = await new Promise((resolve) => setTimeout(() => resolve('1'), 2000))
console.log(result1)
const result2 = await new Promise((resolve) => setTimeout(() => resolve('2'), 2000))
console.log(result2)
console.log("33333")
}
foo()
使用 async 函数重写 promise 链
function demo1() {
let r1 = new Promise((resolve) => {
resolve(1)
}).then((val) => {
console.log('val1:' + val)
return Promise.resolve(val + 1)
}).then((val) => {
console.log('val2:' + val)
return Promise.resolve(val + 1)
})
.catch((e) => {
console.log(e)
})
}
async function demo2() {
try {
let val=1;
let val1=await Promise.resolve(val);
console.log('val1:' + val1)
let val2=await Promise.resolve(val1+1);
console.log('val2:' + va2)
} catch (e) {
console.log(e)
}
}
demo1()
demo2()
以上demo1和的demo2函数的执行过程是一样的。
async/await 和Promise#then 对比以及错误处理: 警告:
大多数 async 函数也可以使用 Promises 编写。但是,在错误处理方面,async 函数更容易捕获异常错误
上面例子中的 demo1
函数和demo2
函数在功能上都是等效的。在demo2
函数中,如果任一await
ed 调用失败,它将自动捕获异常,async 函数执行中断,并通过隐式返回 Promise 将错误传递给调用者。
在 Promise 例子中这种情况同样会发生,该函数必须负责返回一个捕获函数完成的Promise
。在demo1
函数中,这意味着它从Promise.all([]).then()
返回一个 Promise。
微信公公众号 搜索 “不正经小前端” 并关注,和我一起学习海量前端技术
本文来自博客园,作者:七分暖,转载请注明原文链接:https://www.cnblogs.com/lin494910940/p/16414501.html