首页 > 编程语言 >javascript 高级编程系列 - async/await

javascript 高级编程系列 - async/await

时间:2023-02-16 20:46:02浏览次数:38  
标签:await const log javascript console return async

async/await其实是生成器的语法糖,async用于声明一个函数是异步的,而await用于等待一个异步方法执行完成,并且await只能出现在async函数中。

1. async 函数

async函数返回一个Promise对象,因此可以使用Promise对象的相关方法去进 一步处理async函数返回的结果。

async function asyncFn(){
  return 'test async';
}
let promise = asyncFn();
promise.then((value)=> {
  console.log(value); // 'test async'
});

2. await 关键字

await 等待任意表达式的结果,可以是一个普通函数调用也可以是一个异步事件处理,或者一个表达式。

function doSomething(){
  return 'test';
}

async function asyncTest1(){
  return Promise.resolve('test1');
}

async function asyncTest2(){
  const res1 = await doSomething();
  const res2 = await asyncTest1();
  console.log(res1, res2); // test test1
  return 'test2';
}

const res = asyncTest2();
console.log(res); // Promise {pending}
res.then(v => console.log(v)); // 'test2'

3. async/await 处理异步编程

处理多个异步操作的链式调用的时,可以使用async/await进行进一步优化编程方式,使其更像是同步操作。

  • Promise的链式调用
const excuteAsyncTask = (n) => {
  return new Promise((resolve, reject)=> {
    setTimeout(()=> resolve(n+1), 200);
  });
};

const step1 = (n) => { console.log('step1');  return excuteAsyncTask(n); };
const step2 = (n) => { console.log('step2');  return excuteAsyncTask(n); };
const step3 = (n) => { console.log('step3');  return excuteAsyncTask(n); };

const doTask = () => {
  step1(0)
  .then(v1 => step2(v1))
  .then(v2 => step3(v2))
  .then(v => {
    console.log(v);
  });
};
doTask();  //step1 step2 step3 3
  • async/await
const excuteAsyncTask = (n) => {
  return new Promise((resolve, reject)=> {
    setTimeout(()=> resolve(n+1), 200);
  });
};
const step1 = (n) => { console.log('step1');  return excuteAsyncTask(n); };
const step2 = (n) => { console.log('step2');  return excuteAsyncTask(n); };
const step3 = (n) => { console.log('step3');  return excuteAsyncTask(n); };
const doTask = async () => {
  const v1 = await step1(0);
  const v2 = await step2(v1);
  const v3 = await step3(v2);
  console.log(v3);
};
doTask();  //step1 step2 step3 3

4. async/await捕获异常

const doTask = async () => {
  try {
    let a = await Promise.reject('reject');
  } catch(error){
    console.log(error); // reject
  }
};
doTask();

5. async/await 的优点

  • 代码书写更加同步, 相对链式调用可读性更强。
  • 错误处理更加友好, 使用try catch 语句能更好的捕获错误
  • 调试更加方便,Promise的链式调用,调试器无法进入代码块

标签:await,const,log,javascript,console,return,async
From: https://www.cnblogs.com/xiaodi-js/p/17128219.html

相关文章

  • JavaScript 基础 - Day01
    了解变量、数据类型、运算符等基础概念,能够实现数据类型的转换,结合四则运算体会如何编程。体会现实世界中的事物与计算机的关系理解什么是数据并知道数据的分类理解......
  • JavaScript体验
    JavaScript体验(来自本站javascript教程)JavaScript实例代码:JavaScript可以直接在HTML输出:document.write("<p>这是一个段落。</p>");JavaScript事件响应:<bu......
  • Asynchronous programming with async and await
    原文地址:https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/#start-tasks-concurrentlyTheTaskasynchronousprogrammingmodel(TAP)prov......
  • async 和defer的区别
    答:相同点:只适用于外联脚本,这一点和defer一致,也就是script标签要有src属性。不同点:async和defer的执行时机不同,async是在加载完后立即执行,执行的过程仍会阻塞后续html的......
  • vue3之异步组件defineAsyncComponent 使用无效?
    原文地址:我的稀土掘金介绍:defineAsyncComponent用于拆分应用为更小的块,并仅在需要时再从服务器加载相关组件官网案例<scriptsetup>import{defineAsyncComponent......
  • javascript放在head和body的区别以及js文件加载带来的阻塞解决
    今天在看到菜鸟教程中的HTML中的Javascript脚本代码必须位于<script>与</script>标签之间。Javascript脚本代码可被放置在HTML页面的<body>和<head>部分中......
  • JavaScript 中 ?. 和 ?? 分别是什么?
    ?.和??是JavaScript中的两个新操作符,分别是可选链操作符(optionalchainingoperator)和空值合并操作符(nullishcoalescingoperator)。?.操作符?.可选链操作符用于......
  • 异步注解@Async使用记录
    使用场景:需要执行某个方法但不需等待该方法的执行结果或者需要执行多个方法但这些方法不需要先后执行,可以通过声明并调用异步方法实现.因为每执行一个异步方法都需要从线......
  • 浏览器前端 JavaScript Worker使用
    主Js文件内容://注意://使用前先判断浏览器是否支持//Worker内的代码不可以操作DOM//不能跨域加载Worker的js文件if(window.Worker!==undefined){//新建Worker......
  • .Net6对AOP的多种支持之IAsyncActionFilter
    环境:  .Net6  windows10  Web项目 ps:Log4net写入到文件以及写入到数据库中开发工具:Vs2022IAsyncActionFilter(日志异步实现) IAsynctionFilter概念......