async awit 异步调用的理解及应用

async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

1.1. async 起什么作用
async 函数,输出的是一个 Promise 对象。(从文档中也可以得到这个信息),async 函数(包含函数语句、函数表达式、Lambda表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。

async function testAsync() {return "hello async";
}const result = testAsync();
console.log(result);
  1. async/await 干了啥
    2.1 比较
    示例:
    //用 setTimeout 模拟耗时的异步操作
function takeLongTime() {return new Promise(resolve => {setTimeout(() => resolve("long_time_value"), 1000);});
}takeLongTime().then(v => {console.log("got", v);
});

//如果改用 async/await 呢,会是这样

function takeLongTime() {return new Promise(resolve => {setTimeout(() => resolve("long_time_value"), 1000);});
}async function test() {const v = await takeLongTime();console.log(v);
}test();

2.2. async/await 的优势在于处理 then 链
单一的 Promise 链并不能发现 async/await 的优势,但是,如果需要处理由多个 Promise 组成的 then 链的时候,优势就能体现出来了(很有意思,Promise 通过 then 链来解决多层回调的问题,现在又用 async/await 来进一步优化它)。

假设一个业务,分多个步骤完成,每个步骤都是异步的,而且依赖于上一个步骤的结果。我们仍然用 setTimeout 来模拟异步操作:

/*** 传入参数 n,表示这个函数执行的时间(毫秒)* 执行的结果是 n + 200,这个值将用于下一步骤*/
function takeLongTime(n) {return new Promise(resolve => {setTimeout(() => resolve(n + 200), n);});
}function step1(n) {console.log(`step1 with ${n}`);return takeLongTime(n);
}function step2(n) {console.log(`step2 with ${n}`);return takeLongTime(n);
}function step3(n) {console.log(`step3 with ${n}`);return takeLongTime(n);
}

现在用 Promise 方式来实现这三个步骤的处理

function doIt() {console.time("doIt");const time1 = 300;step1(time1).then(time2 => step2(time2)).then(time3 => step3(time3)).then(result => {console.log(`result is ${result}`);console.timeEnd("doIt");});
}doIt();// c:\var\test>node --harmony_async_await .
// step1 with 300
// step2 with 500
// step3 with 700
// result is 900
// doIt: 1507.251ms

输出结果 result 是 step3() 的参数 700 + 200 = 900。doIt() 顺序执行了三个步骤,一共用了 300 + 500 + 700 = 1500 毫秒,和 console.time()/console.timeEnd() 计算的结果一致。

如果用 async/await 来实现呢,会是这样

async function doIt() {console.time("doIt");const time1 = 300;const time2 = await step1(time1);const time3 = await step2(time2);const result = await step3(time3);console.log(`result is ${result}`);console.timeEnd("doIt");
}doIt();

结果和之前的 Promise 实现是一样的,但是这个代码看起来应该清晰得多,几乎跟同步代码一样

可参考:
阮一峰es6 ;
https://segmentfault.com/a/1190000007535316

async awit 异步调用的理解及应用相关推荐

  1. java 异步调用 事务_深入理解Spring注解@Async解决异步调用问题

    序言:Spring中@Async 根据Spring的文档说明,默认采用的是单线程的模式的.所以在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的. 那么当多个任务的执行势必会相互影响. ...

  2. Spring Boot使用@Async实现异步调用:自定义线程池

    在之前的Spring Boot基础教程系列中,已经通过<Spring Boot中使用@Async实现异步调用>一文介绍过如何使用 @Async注解来实现异步调用了.但是,对于这些异步执行的 ...

  3. springboot 异步mysql_spring boot 使用@Async实现异步调用方法

    使用@Async实现异步调用 什么是"异步调用"与"同步调用" "同步调用"就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码 ...

  4. Spring Boot使用@Async实现异步调用:ThreadPoolTaskScheduler线程池的优雅关闭

    上周发了一篇关于Spring Boot中使用@Async来实现异步任务和线程池控制的文章:<Spring Boot使用@Async实现异步调用:自定义线程池>.由于最近身边也发现了不少异步 ...

  5. 使用@Async进行异步调用详解

    本文说下使用@Async进行异步调用详解 文章目录 概述 概述

  6. spring boot 学习(十一)使用@Async实现异步调用

    使用@Async实现异步调用 什么是"异步调用"与"同步调用" "同步调用"就是程序按照一定的顺序依次执行,,每一行程序代码必须等上一行代码 ...

  7. 注解@Async解决异步调用问题

    注解@Async解决异步调用问题 参考文章: (1)注解@Async解决异步调用问题 (2)https://www.cnblogs.com/mmzs/p/11557583.html 备忘一下.

  8. Spring Boot 中使用@Async实现异步调用,加速任务执行!

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...

  9. Spring Boot中使用@Async实现异步调用

    什么是"异步调用"? "异步调用"对应的是"同步调用",同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执 ...

最新文章

  1. 迁移物理solaris系统至一个区域
  2. 一台计算机有64,在同一台计算机上使用带有32位和64位Altium设计软件的数据库元件库...
  3. 从GitHub上无法下载子模块问题解决
  4. python之time和datetime的常用方法
  5. 机器学习的数学基础(1)--Dirichlet分布
  6. Google 机器学习应用的43条经验法则
  7. 便利删除_知名便利店凉了?!刚刚道歉
  8. 游戏筑基开发之printf及利用一维数组输出杨辉三角
  9. ie6下margin间距是两倍的解决办法
  10. 安固士科技——“智慧工地”的核心技术是什么?
  11. c语言运行太短怎么毡筒,C语言程序设计 最简单的C程序设计.ppt
  12. 什么是TorchScript
  13. Angular读取文件内容并显示
  14. ios 高德获取定位_更新日志-iOS 定位SDK | 高德地图API
  15. ES7241D低功耗音频ADC芯片##小爱音响
  16. @TableField fill
  17. VS2012安装DirectX SDK(DXSDK_Feb10)
  18. glibc 知:手册06:字符集处理
  19. 技巧分享:视频配音怎么制作?(内附3种配音教程)
  20. python3 使用openpyxl 处理excel表格数据

热门文章

  1. xct-tt3441810
  2. 分析方法论探讨之设计意图
  3. 【IVI】VehicleService启动
  4. CAVE: A Visual Analytics System for Exploratory Columnar Data Augmentation Using Knowledge Graphs
  5. 获取短信数据 并且备份
  6. 《魔兽争霸》工具大全
  7. 【笔记】二进制八进制十进制十六进制互转详细教程和范例
  8. 论向大佬提问问题的正确方式。
  9. 剪切的文件还能恢复吗?挽救误操作
  10. 架构师究竟比高级开发厉害在哪?