自动将函数转换为Promise。当调用异步函数时,函数返回值将被解析。您可以在异步函数内使用awaitAwait- 暂停异步函数的执行(var result=wait someAsyncCall())
当在Promise 前面使用时,await 会等待Promise 完成并返回Promise 的结果。 wait只能与Promise一起使用,不能与callback一起使用。 wait 只能在异步函数中使用。
Async/Await 和 Generator
async 函数是ES6 提出的。它的本质上面是Generator函数的语法糖,但它在以下四点上做了很大的改进:
内置执行器:Generator函数的执行必须依赖执行器,而async函数有自己的执行器,调用方式与普通函数调用相同。语义:与Generator函数的*和yield相比,async/await无疑更具语义性。返回值为Promise: async 函数的返回值是Promise 对象,ohahhazi 和Generator 函数返回的Lterator 对象更方便。可以直接使用then()方法进行链式调用。适用范围更广:co模块约定,yield命令后面只能跟Thunk函数或者Promise对象。异步函数的await 命令后面可以跟Promise 或原始类型值。
二、async 语法
首先,async函数返回一个Promise对象,这意味着async函数内部return返回的值将成为then方法回调函数的参数,相当于return Promise.resolve(value)。
异步函数f() {
返回“你好异步”
};
f().then( (v)=console.log(v))
//hello async 接下来,async 函数返回的Promise 对象必须等到所有内部await 命令的Promise 对象执行完毕后状态才会发生变化。
const 延迟=超时=new Promise(resolve=setTimeout(resolve, console.log(timeout) 超时))
异步函数f(){
等待延迟(1000)
等待延迟(2000)
等待延迟(3000)
返回“结束”
}
f().then(v=console.log(v)) //需要等待6 秒才能输出"end"。正常情况下,await 命令后面跟着一个Promise。如果没有,它将转换为立即解决Promise。
异步函数f() {
返回等待1
};
f().then( (v)=console.log(v)) //1最后,如果async函数内部抛出异常,会导致返回的Promise对象状态变为reject状态。抛出的错误将被catch方法回调函数接收。
异步函数e(){
抛出新的错误("错误");
}
e().then(v=console.log(v))
.catch( e=console.log(e));
三、async和其他异步操作的比较
直接输入代码:
首先定义一个可以获取github用户的fetch方法:
函数fetchUser() {
返回新的Promise((解决, 拒绝)={
fetch("https://api.github.com/users/srtian")
.then((数据)={
解析(data.json())
},(错误)={
拒绝(错误)
})
})
}
Promise
函数getUserByPromise() {
获取用户()
.then((数据)={
控制台.日志(数据)
},(错误)={
控制台.log(错误)
}
}
getUserByPromise();看起来,使用Promise进行异步操作是很好的,但是有一个问题是,一旦then太多,代码就会变得非常长、复杂,而且语义不明显,代码流程也不是很好。代表执行过程。
Generator
函数*fetchUserByGenerator() {
const 用户=产量fetchUser()
返回用户
}
const g=fetchUserByGenerator()
const 结果=g.next().value
结果.then((v)={
控制台.log(v)
},(错误)={
控制台.log(错误)
})Generator方法解决了Promise的一些问题,流程更加直观和语义化。但Generator的问题是函数的执行依赖于执行器,每次都需要通过g.next()来执行。而虽然语义上有了改进,但*和yield显然仍然不能满足我们对语义直观观察的需求。
async
异步函数getUserByAsync(){
让用户=等待fetchUser()
返回用户
}
getUserByAsync()
.then(v=console.log(v)) 和async/await 很好地解决了上面两个异步操作的一些问题。首先,使用同步的方法来编写异步,代码非常清晰直观;其次,使用async和await,它们语义很好,一眼就能看出代码执行的顺序;最后,asunc函数有自己的执行器,执行时不需要手动加载。
四、其他
错误处理
除了上述之外,Async 函数的错误处理还需要额外注意:
让一个
异步函数f() {
等待Promise.reject("错误")
a=等待1
}
f().then(v=console.log(a)) 上面的a=wait 1 不执行。这是因为在async函数中,只要有一个await处于reject状态,后面的await就不会被执行。所以我们需要使用try/catch来解决这个问题:
让一个
异步函数正确() {
尝试{
等待Promise.reject("错误")
} 捕获(错误){
控制台.log(错误)
}
a=等待1
返回一个
}
Correct().then(v=console.log(a)) //1
并行
当我们需要使用并行加载时,也许可以使用async,但是这样效率很低,比如这样:
等待一个()
等待b()
等待c()
用回调替换wait d() 如下所示:
一个(()={
b(()={
c(()={
d()
})
})
然而我们发现,在原来的代码中,函数c可以和a同时执行,但是async/await语法会让我们倾向于在b执行完之后再执行c。
所以我们实际上可以这样做:
异步函数ab() {
等待一个()
b()
}
异步函数cd() {
等待c()
d()
}
Promise.all([ab(), cd()]) 参考:
关于本次深入解析:异步编程中的async与await和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
【深入解析:异步编程中的async与await】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于有人写了 async/await 的文章了!我一直很想了解这个概念。
有14位网友表示赞同!
学习异步编程确实有些困难,希望这篇文章能帮我理清思路。
有8位网友表示赞同!
async/await 简化了异步代码的编写,很期待看到具体的例子。
有18位网友表示赞同!
想尝试一下 async/await 在项目中的应用,看看效果怎么样。
有9位网友表示赞同!
对于新手来说,学习 async/await 的步骤可以简单明了吗?
有14位网友表示赞同!
这篇文章能教会我如何用 async/await 处理网络请求吗?
有9位网友表示赞同!
异步编程在web开发中真的很重要,希望能深入了解这种技术的原理。
有9位网友表示赞同!
async/await 能提升代码的读写性能吗?期待更多实践经验分享。
有11位网友表示赞同!
我最近遇到一些异步问题,这篇文章或许可以帮我找到解决方案。
有15位网友表示赞同!
文章中能不能包含一些比较生动的案例,更容易理解概念?
有12位网友表示赞同!
async/await 与 Promise 之间的关系是什么?希望能够更加清楚地了解它们的区别。
有16位网友表示赞同!
期待看到 async/await 应用于不同场景的示例代码,比如数据库操作等。
有8位网友表示赞同!
初学者需要掌握哪些基础知识才能更好地学习 async/await?
有16位网友表示赞同!
这篇文章介绍的是哪个语言环境下的 async/await?
有13位网友表示赞同!
文章中提到了具体的工具和库吗?可以方便我进行一些实践操作吗?
有7位网友表示赞同!
异步编程会带来什么性能提升?希望更详细的分析结果。
有20位网友表示赞同!
学习异步编程真的很有挑战性,需要持续积累经验
有11位网友表示赞同!
期待看到更多关于 async/await 的进阶文章,比如如何优化异步代码
有20位网友表示赞同!
"初探" 意味着这篇文章只是浅层介绍?后续会发布更深入的内容吗?
有15位网友表示赞同!