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();

上面代码中,getFoogetBar是两个独立的异步操作(即互不依赖),被写成继发关系。这样比较耗时,因为只有getFoo完成以后,才会执行getBar,完全可以让它们同时触发。

// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

上面两种写法,getFoogetBar都是同时触发,这样就会缩短程序的执行时间。

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处理异步相关推荐

  1. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

  2. js async await 终极异步解决方案

    js async await 终极异步解决方案 参考文章: (1)js async await 终极异步解决方案 (2)https://www.cnblogs.com/CandyManPing/p/9 ...

  3. vue 表格中有列需要异步加载_Vue中使用async/await解决异步请求问题

    1.async/await场景 用同步的思维来解决异步问题,当前端接口调用需要等到接口返回值以后渲染页面. 2.名词解释 async async的用法,它作为一个关键字放到函数前面,用于表示函数是一个 ...

  4. async await 处理异步变同步(微信小程序内举例)

    1.async起什么作用?   输出的是一个Promise对象 注: 1)async函数返回的是一个Promise对象.Async函数(包含函数语句.函数表达式.Lambda表达式)会返回一个Prom ...

  5. 微信小程序 async await解决异步问题

    小程序大部分函数和数据库操作都是异步执行的,如果希望同步执行,需要用到async 和await这对基友,必须成对出现. 为了快速验证 async/await 可用,在 App.js 的 onLaunc ...

  6. Async/Await(异步处理)

    async/await async 是Generator函数的语法糖,并对Generator函数进行了改进.ES7 版本中引入 一个线程(或函数)执行到一半,可以暂停执行,将执行权交给另一个线程(或函 ...

  7. ASP.NET WebForm中用async/await实现异步

    1. 在.aspx中添加异步标记 <%@ Page Language="C#" Async="true"%> 2. 在.aspx.cs或者.ascx ...

  8. ES8新特性 async,await实现异步

    async的返回结果为promise类型 await须和async搭配使用 async与await搭配实现异步

  9. Nodejs 新特性 async await 的使用 以及使用 async await 处理异步

    1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await

最新文章

  1. 微服务架构 — 微服务框架
  2. js计算两个时间之间天数差的实例代码
  3. shell脚本输出菱形与等边三角形
  4. c四舍五入取整函数_学会这8个Excel函数,工作瞬间好轻松!
  5. Redis概述、数据类型
  6. iOS tabview 适配问题
  7. HALCON示例程序classify_citrus_fruits.hdev应用常规gmm分类器进行水果分类
  8. Install VMware tools 解决(物理主机WIN7X64和VM下的REHAT LINUX AS4共享文件)
  9. Field 'CID' doesn't have a default value
  10. 编程:请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”...
  11. 阶段3 1.Mybatis_12.Mybatis注解开发_6 mybatis注解开发一对一的查询配置
  12. java 毕向东 笔记_毕向东Java基础部分笔记
  13. 2020年全国大学生数学建模B题题目概要
  14. 摄像机DSP芯片介绍
  15. html制作3d动画效果,【分享】HTML5的Canvas制作3D动画效果分享
  16. Domino管理中的一些小而有大用处的技巧
  17. 拉东(Radon)变换
  18. 走近“领域特定语言”
  19. 【机器人运动学/姿态角】欧拉角和RPY角
  20. jpa分组分页查询 返回总数错误解决

热门文章

  1. ggplot2 | 位置调整函数
  2. html 进度条roll,js实现增加数字显示的环形进度条效果
  3. python结构_Python 项目的结构
  4. 学习前端的未来在哪里?今天详细的谈一下
  5. 动态调整linux分区大小,GParted 动态调整Linux分区大小
  6. 使用pkg打包编译nodejs程序,手动设置缓存内容
  7. 七牛HTML 上传按钮,七牛 JSSDK 配置+常见问题
  8. Java实现redis管道
  9. 错误集合_20220131
  10. 部署邮件服务器之间相互通信