JavaScript中的await函数使用小结

 更新时间:2024年01月31日 10:24:27   作者:黄梅之俊雅  
async 函数是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字,async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise,这篇文章主要介绍了JavaScript中的await,需要的朋友可以参考下

JavaScript中的await

先来介绍一下async 函数

async 函数是使用async关键字声明的函数。async 函数是 AsyncFunction 构造函数的实例,并且其中允许使用 await 关键字。async 和 await 关键字让我们可以用一种更简洁的方式写出基于 Promise 的异步行为,而无需刻意地链式调用 promise。

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}
async function asyncCall() {
  console.log('calling');
  const result = await resolveAfter2Seconds();
  console.log(result);
  // Expected output: "resolved"
}
asyncCall();

async 函数可能包含 0 个或者多个 await 表达式。await 表达式会暂停整个 async 函数的执行进程并出让其控制权,只有当其等待的基于 promise 的异步操作被兑现或被拒绝之后才会恢复进程。promise 的解决值会被当作该 await 表达式的返回值。使用 async/await 关键字就可以在异步代码中使用普通的 try/catch 代码块。

注意: await关键字只在 async 函数内有效。如果你在 async 函数体之外使用它,就会抛出语法错误 SyntaxError 。
备注: async/await的目的为了简化使用基于 promise 的 API 时所需的语法。async/await 的行为就好像搭配使用了生成器和 promise。

await概念

await 操作符用于等待一个 Promise 兑现并获取它兑现之后的值。它只能在异步函数或者模块顶层中使用。

await expression;

expression为要等待的 Promise 实例,Thenable 对象,或任意类型的值。

返回值:返回从 Promise 实例或 thenable 对象取得的处理结果。如果等待的值不符合 thenable,则返回表达式本身的值

异常:拒绝(reject)的原因会被作为异常抛出。

await 通常用于拆开 promise 的包装,使用方法是传递一个 Promise 作为 expression。使用 await 总会暂停当前异步函数的执行,在该 Promise 敲定(settled,指兑现或拒绝)后继续执行。函数的执行恢复(resume)时,await 表达式的值已经变成了 Promise 兑现的值。

若该 Promise 被拒绝(rejected),await 表达式会把拒绝的原因(reason)抛出。当前函数(await 所在的函数)会出现在抛出的错误的栈追踪(stack trace),否则当前函数就不会在栈追踪出现。

await 总会同步地对表达式求值并处理,处理的行为与 Promise.resolve() 一致,不属于原生 Promise 的值全都会被隐式地转换为 Promise 实例后等待。处理的规则为,若表达式:

  • 是一个原生 Promise(原生Promise 的实例或其派生类的实例,且满足 expression.constructor ===
  • Promise),会被直接用于等待,等待由原生代码实现,该对象的 then() 不会被调用。
  • 是 thenable 对象(包括非原生的 Promise 实例、polyfill、Proxy、派生类等),会构造一个新 Promise用于等待,构造时会调用该对象的 then() 方法。
  • 不是 thenable 对象,会被包装进一个已兑现的 Promise 用于等待,其结果就是表达式的值。

等待 Promise 的兑现

当一个 Promise 被传递给 await 操作符,await 将等待该 Promise 兑现,并在兑现后返回该 Promise 兑现的值。

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}
async function f1() {
  let x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}
f1();

转换为 promise

若表达式的值不是 Promise,await 会把该值转换为已兑现的 Promise,然后返回其结果。

async function f3() {
  const y = await 20;
  console.log(y); // 20
  const obj = {};
  console.log((await obj) === obj); // true
}
f3();

promise 被拒绝

如果 Promise 被拒绝,则抛出拒绝的原因。

async function f4() {
  try {
    const z = await Promise.reject(30);
  } catch (e) {
    console.error(e); // 30
  }
}
f4();

处理被拒绝的 promise

你可以链式调用 catch()(而不是使用 try)以在等待 promise 兑现之前处理被拒绝的 promise。

const response = await promisedFunction().catch((err) => {
  console.error(err);
  return "default response";
});
// response will be "default response" if the promise is rejected

到此这篇关于JavaScript中的await的文章就介绍到这了,更多相关JavaScript await内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js 无提示关闭浏览器页面的代码

    js 无提示关闭浏览器页面的代码

    js 无提示关闭浏览器页面的代码与函数需要的朋友可以参考下。
    2010-03-03
  • JavaScript禁止用户多次提交的两种方法

    JavaScript禁止用户多次提交的两种方法

    这篇文章主要介绍了JavaScript禁止用户多次提交的两种方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • JavaScript使用小插件实现倒计时的方法讲解

    JavaScript使用小插件实现倒计时的方法讲解

    今天小编就为大家分享一篇关于JavaScript使用小插件实现倒计时的方法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • JS拉起或下载app的实现代码

    JS拉起或下载app的实现代码

    最近做项目遇到这样的需求,通过手机网页判断是否安装了自己公司app,如果安装了则拉起app,没有安装则跳转到下载页。怎么实现呢?下面小编给大家分享js拉起或下载app的实现代码,需要的朋友参考下
    2017-02-02
  • 用fabric.js搞定电子签名拖拽合成图片的完整步骤

    用fabric.js搞定电子签名拖拽合成图片的完整步骤

    fabric.js是一个强大的JavaScript HTML5 canvas库,它让开发者可以轻松操作画布上的图形、文本和图像,支持缩放、旋转、拖拽等交互功能,这篇文章主要介绍了用fabric.js搞定电子签名拖拽合成图片的相关资料,需要的朋友可以参考下
    2026-05-05
  • JavaScript Event学习第五章 高级事件注册模型

    JavaScript Event学习第五章 高级事件注册模型

    在这一章我会讲解两种高级时间注册模型:W3C和微软的。因为这两个方法都不能跨浏览器,所以在现在看来他们的使用场合并不多。
    2010-02-02
  • 前端判断页签是否为活跃状态的常用方法

    前端判断页签是否为活跃状态的常用方法

    文章介绍了在网页开发中判断页签是否为活跃状态的几种方法,包括前端开发方法(通过CSS类名、事件监听、URLHash或路由)、React和Vue框架中的实现以及浏览器页签的活跃状态判断(使用PageVisibilityAPI),需要的朋友可以参考下
    2025-12-12
  • 小程序自定义弹出框效果

    小程序自定义弹出框效果

    这篇文章主要为大家详细介绍了小程序自定义弹出框效果,支持淡入淡出动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JavaScript实现私有属性的几种方式小结

    JavaScript实现私有属性的几种方式小结

    在JavaScript中,私有属性是指只能在对象内部访问的属性,外部无法直接访问,JavaScript并没有提供官方的私有属性的支持,但可以通过一些技巧来模拟实现私有属性,所以本文给大家总结了JavaScript实现私有属性的几种方式,需要的朋友可以参考下
    2024-04-04
  • javascript DOM设置样式详细说明和示例代码

    javascript DOM设置样式详细说明和示例代码

    JavaScript也可以用来修改DOM元素的样式,我们可以使用style属性来访问和修改元素的样式属性,这篇文章主要给大家介绍了关于javascript DOM设置样式详细说明和示例代码的相关资料,需要的朋友可以参考下
    2024-06-06

最新评论