了解js中async-await

简介: 了解async异步函数如何使用并且使用中的注意点

async异步函数

async 关键字用于声明一个异步函数

// 写法一:

async function foo1() {


}

// 写法二:

const foo2 = async () => {


}

// 写法三:

class Foo {

 async bar() {


 }

}

async异步函数与普通函数的区别

1. 返回值

函数的返回值为promise对象

  1. 如果返回值是一个非Promise类型的数据,返回的是一个成功的Promise对象
  2. 如果返回值是一个Promise类型的对象,Promise类型的对象的结果就是这个Promise对象的结果
  3. 抛出异常的话,返回的是一个失败的Promise对象

2. 异常

普通函数:

function foo() {

 console.log("foo function start~")

 console.log("中间代码~")

 throw new Error("error message")

 console.log("foo function end~")

}

foo().catch(err => {

 console.log("error message:", err)

})

console.log("后续还有代码~~~~~")

// 输出抛出异常前面的代码并抛出异常,后面代码不执行

异步函数:

async function foo() {

 console.log("foo function start~")

 console.log("中间代码~")

 // 异步函数中的异常, 会被作为异步函数返回的Promise的reject值的

 throw new Error("error message")

 console.log("foo function end~")

}

foo().catch(err => {

 console.log("error message:", err)

})

console.log("后续还有代码~~~~~")

// 后续代码会被执行,之后打印错误信息

如果我们在async中抛出了异常,那么程序它并不会像普通函数一样报错,而是会作为Promise的reject来传递;

await关键字

await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被兑现或被拒绝之后才会恢复进程。promise 的解决值会被当作该 await 表达式的返回值

function requestData1() {

 return new Promise((resolve, reject) => {

   setTimeout(() => {

     resolve(1111)

   }, 2000);

 })

}


function requestData2() {

 return new Promise((resolve, reject) => {

   setTimeout(() => {

     reject(222)

   }, 3000);

 })

}


async function foo1() {

 // 1.await跟上表达式

 const res1 = await requestData1()

 // 2. await跟上其他值

 const res2 = await 123  // "await" 对此表达式的类型没有影响

 console.log("后面的代码1", res1)

 console.log("后面的代码2", res2)

}

foo1()


// 3.reject值

async function foo2() {

 try {

   const res3 = await requestData2()

   console.log("res3:", res3)

 } catch (error) {

   console.log(error);

 }

}


foo2().catch(err => {

 console.log("err:", err)

})

await 表达式

  1. await右侧的表达式一般为promise对象,但也可以是其他的值
  2. 如果表达式是promise对象,await返回的是promise成功的值
  3. 如果表达式是其他值,直接将此值作为await的返回值
  4. await xxx是同步的,但await下面的代码都是相当于.then里的(微任务)

注意

  1. await必须写在async函数中,但async函数中可以没有await
  2. 如果awaitpromise失败了,就会抛出异常,需要通过try...catch捕获处理
目录
相关文章
|
2月前
|
JavaScript 前端开发 开发者
掌握Node.js中的异步编程:从回调到async/await
Node.js的异步编程模型是其核心特性之一,它使得开发者能够构建高性能和高并发的应用程序。本文将带你从Node.js的异步编程基础开始,逐步深入到回调函数、Promises、以及最新的async/await语法。我们将探讨这些异步模式的原理、使用场景和最佳实践,并通过实例代码展示如何在实际项目中应用这些概念。
|
3月前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
4月前
|
前端开发 JavaScript 小程序
【JS】async、await异常捕获,这样做才完美
本文通过生动的例子说明了在JavaScript中使用async/await时,不捕获异常可能导致的问题,并介绍了三种处理异步调用异常的方法:try-catch、使用Promise的`.catch`以及`await-to-js`插件库。通过这些方法,可以有效避免异常导致的程序中断,提升代码的健壮性和可读性。
82 0
【JS】async、await异常捕获,这样做才完美
|
5月前
|
前端开发 JavaScript
js【详解】async await
js【详解】async await
40 0
|
7月前
|
JSON 前端开发 JavaScript
js中await用法
js中await用法
162 0
|
7月前
|
前端开发 JavaScript UED
前端 js 经典:async 和 await
前端 js 经典:async 和 await
92 2
|
6月前
|
前端开发 JavaScript
如何使用 await-to-js 库优雅的处理 async await 错误
如何使用 await-to-js 库优雅的处理 async await 错误
111 0
|
7月前
|
前端开发 JavaScript
在 Vue 中,Promise 和 async/await 有什么不同?
在 Vue 中,Promise 和 async/await 有什么不同?
139 0
|
7月前
|
前端开发 JavaScript API
什么是 JavaScript 中的 Async/Await
什么是 JavaScript 中的 Async/Await
37 0
|
7月前
|
JavaScript 前端开发 开发者
7个Js async/await高级用法
7个Js async/await高级用法
137 0