异步函数async和await

背景

最近在回头看nfd项目 的源码,看到了使用async和await的js代码,因此想了解一下代码运行的机制。

一个例子

function SicBo() {
 return new Promise((resolve, reject) => {
   console.log("开始摇")
   setTimeout(() => {
     let n = parseInt(Math.random() * 6 + 1, 10)
     resolve(n)
  }, 1000)
})
}

上述代码的执行过程如下:

  • 立即执行 console.log("开始摇") —— ✅ 马上输出。
  • 启动一个“1秒后执行的任务” —— 通过 setTimeout(...) 注册了一个回调,1 秒后执行。
  • 返回一个 Promise 对象,这个 Promise 会在 1 秒后变成“完成状态”并给出点数。

如果直接调用这个函数:

function test() {
 const result = SicBo()
 console.log('骰子结果:', result)
}
test()

调用输出如下:

开始摇
骰子结果: Promise { <pending> }

显然并不是我们想要的结果

异步函数的一般调用:

SicBo().then(result => {
 console.log('骰子结果:', result)
})

这种写法最大的弊端是会产生回调地狱,即调用多个异步函数产生嵌套,导致代码可读性变差。

异步函数的async和await调用:

async function test() {
 const result = await SicBo()
 console.log('骰子结果:', result)
}
test()

调用输出如下:

开始摇
(等待1秒)
骰子结果: 3

异步函数外部调用

async function demo() {
 console.log('A. 开始')
 await SicBo()
 console.log('B. 结束')
}

demo()
console.log('C. 我是其他逻辑')

调用输出如下:

A. 开始
开始摇
C. 我是其他逻辑
(等待1秒)
B. 结束
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇