async/await处理异步
async函数返回一个Promise对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
看代码:
指定多少毫秒后输出一个值
function timeout(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);}); }async function asyncPrint(value, ms) {await timeout(ms);console.log(value); }asyncPrint('hello world', 50);
async
函数内部return
语句返回的值,会成为then
方法回调函数的参数。
自己试着写了一段代码:
function f1(){console.log('first step');return 1; } function f2(num){return new Promise((resolve,reject)=>{setTimeout(()=>{resolve(2*num)},3000);}) } function f3(){console.log('third step') }async function test(){let first=await f1();let second=await f2(first);console.log(second);let third=await f3();console.log('end'); }
输出结果如下:
正常情况下,await
命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。还有一种情况,await后面是一个thenable对象(即定义then方法的对象),那么await会将其等同于Promise对象。
注意:
1、任何一个await语句后面的promise对象为reject状态,那么整个async函数都会中断执行。
async function f() {await Promise.reject('出错了');await Promise.resolve('hello world'); // 不会执行 }
上面代码中,第二个await
语句是不会执行的,因为第一个await
语句状态变成了reject
。
有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await
放在try...catch
结构里面,这样不管这个异步操作是否成功,第二个await
都会执行。
2、多个await命令后面的异步操作,如果不存在继发关系,最好让他们同时触发。
let foo = await getFoo(); let bar = await getBar();
上面代码中,getFoo
和getBar
是两个独立的异步操作(即互不依赖),被写成继发关系。这样比较耗时,因为只有getFoo
完成以后,才会执行getBar
,完全可以让它们同时触发。
// 写法一 let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 写法二 let fooPromise = getFoo(); let barPromise = getBar(); let foo = await fooPromise; let bar = await barPromise;
上面两种写法,getFoo
和getBar
都是同时触发,这样就会缩短程序的执行时间。
3、await 只能用在async函数之中。
async函数的实现原理
async函数的实现原理,就是将Generator函数和自动执行器,包装在一个函数里。
async function fn(args) {// ... }// 等同于function fn(args) {return spawn(function* () {// ... }); }
所有的async
函数都可以写成上面的第二种形式,其中的spawn
函数就是自动执行器。
转载于:https://www.cnblogs.com/shenting/p/10572857.html
async/await处理异步相关推荐
- Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...
- js async await 终极异步解决方案
js async await 终极异步解决方案 参考文章: (1)js async await 终极异步解决方案 (2)https://www.cnblogs.com/CandyManPing/p/9 ...
- vue 表格中有列需要异步加载_Vue中使用async/await解决异步请求问题
1.async/await场景 用同步的思维来解决异步问题,当前端接口调用需要等到接口返回值以后渲染页面. 2.名词解释 async async的用法,它作为一个关键字放到函数前面,用于表示函数是一个 ...
- async await 处理异步变同步(微信小程序内举例)
1.async起什么作用? 输出的是一个Promise对象 注: 1)async函数返回的是一个Promise对象.Async函数(包含函数语句.函数表达式.Lambda表达式)会返回一个Prom ...
- 微信小程序 async await解决异步问题
小程序大部分函数和数据库操作都是异步执行的,如果希望同步执行,需要用到async 和await这对基友,必须成对出现. 为了快速验证 async/await 可用,在 App.js 的 onLaunc ...
- Async/Await(异步处理)
async/await async 是Generator函数的语法糖,并对Generator函数进行了改进.ES7 版本中引入 一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函 ...
- ASP.NET WebForm中用async/await实现异步
1. 在.aspx中添加异步标记 <%@ Page Language="C#" Async="true"%> 2. 在.aspx.cs或者.ascx ...
- ES8新特性 async,await实现异步
async的返回结果为promise类型 await须和async搭配使用 async与await搭配实现异步
- Nodejs 新特性 async await 的使用 以及使用 async await 处理异步
1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await
最新文章
- 微服务架构 — 微服务框架
- js计算两个时间之间天数差的实例代码
- shell脚本输出菱形与等边三角形
- c四舍五入取整函数_学会这8个Excel函数,工作瞬间好轻松!
- Redis概述、数据类型
- iOS tabview 适配问题
- HALCON示例程序classify_citrus_fruits.hdev应用常规gmm分类器进行水果分类
- Install VMware tools 解决(物理主机WIN7X64和VM下的REHAT LINUX AS4共享文件)
- Field 'CID' doesn't have a default value
- 编程:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”...
- 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置
- java 毕向东 笔记_毕向东Java基础部分笔记
- 2020年全国大学生数学建模B题题目概要
- 摄像机DSP芯片介绍
- html制作3d动画效果,【分享】HTML5的Canvas制作3D动画效果分享
- Domino管理中的一些小而有大用处的技巧
- 拉东(Radon)变换
- 走近“领域特定语言”
- 【机器人运动学/姿态角】欧拉角和RPY角
- jpa分组分页查询 返回总数错误解决