欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析:异步编程中的async与await

时间:11-07 神话故事 提交错误

自动将函数转换为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 的文章了!我一直很想了解这个概念。

    有14位网友表示赞同!

煮酒

学习异步编程确实有些困难,希望这篇文章能帮我理清思路。

    有8位网友表示赞同!

我绝版了i

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位网友表示赞同!

【深入解析:异步编程中的async与await】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活