Koa2学习(二)async/await

koa2中用到了大量的async/await语法,要学习koa2框架,首先要好好理解async/await语法。

async/await顾名思义是一个异步等待的语法,是es7中为了实现用同步的方式写异步方法的一种新式语法。

async

我们再来看看async到底是一个什么语法:

普通的方法:

function syncF() {
return 'I am a sync result'
}
let sync_result = syncF() console.log(sync_result)

结果:

I am a sync result

同步方法立即返回结果,大家都懂,就不解释了。

async的方法:

async语法 是 一个加持在函数定义时的声明:

async function asyncF() {
return 'I am a async result'
}
let async_result = asyncF() console.log(async_result)

结果:

Promise { 'I am a asyncSync result' }

我们看到执行async的函数时,返回的是一个promise对象,既然是promise对象, 那就好理解了。

promise对象肯定会有一个then方法,用于处理异步结果,我们来试试:

async_result.then((res) => {
console.log(res)
})

结果:

I am a asyncSync result

promise执行的结果会在then里面返回,没有问题。

await

await必须结合async来使用,顾名思义,是async wait (等待异步)的意思。

// 定义一个耗时3秒返回结果的函数
function delayF() {
return new Promise(resolve => {
setTimeout(() => {
resolve('I am a async result')
}, 3000)
})
}
// 定义一个async函数
async function testAwait() {
let start = Date.now()
console.log(await delayF())
console.log(`cost ${Date.now() - start} ms`)
}
testAwait()

结果:

I am a async result
cost 3002 ms

await一般在等待async方法执行完毕,但是其实await等待的只是一个表达式,这个表达式在官方文档里说的是Promise对象,可是它也可以接受普通值。

async function testAsync() {
return 'testAsync'
}
async function testAwait2() {
let time1 = Date.now() await '1233'
let time2 = Date.now()
console.log(`cost ${time2 - time1} ms`) await delayF()
let time3 = Date.now()
console.log(`cost ${time3 - time2} ms`) await testAsync()
let time4 = Date.now()
console.log(`cost ${time4 - time3} ms`)
}
testAwait2()

结果:

cost 1 ms
cost 3002 ms
cost 1 ms

总结

  • async是声明一个异步的函数,返回一个promise对象。
  • await是等待一个表达式(promise)的返回值执行完毕,必须结合async使用。
  • 写在await后面的方法都会等待await中的异步方法执行完毕之后再执行。

Koa2学习(二)async/await的更多相关文章

  1. JS学习- ES6 async await使用

    async 函数是什么?一句话,它就是 Generator 函数的语法糖. 使用场景常常会遇到,请求完一个接口,拿完值再去请求另外一个接口,我们之前回调callback函数处理,如果很多的情况下,看起 ...

  2. js异步回调Async/Await与Promise区别 新学习使用Async/Await

    Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...

  3. ES6-11学习笔记--async,await

    基于Generator异步编程语法糖:async await async默认输出Promise对象 将异步的代码以同步的方式书写,提高代码可阅读性   基本使用: function timeout() ...

  4. koa2学习(二) 中间件router

    中间件 koa-router 安装 npm install --save koa-router 使用 const Koa = require('koa'); const Router = requir ...

  5. Async/Await是这样简化JavaScript代码的

    译者按: 在Async/Await替代Promise的6个理由中,我们比较了两种不同的异步编程方法:Async/Await和Promise,这篇博客将通过示例代码介绍Async/Await是如何简化J ...

  6. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  7. C#线程学习笔记九:async & await入门二

    一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

  8. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  9. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

随机推荐

  1. ActiveMQ windows安装

    下载ActiveMQ 官方网站:http://activemq.apache.org/ 下载,解压缩 以前台安装 ctiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试Ac ...

  2. 跟初学者学习IbatisNet第三篇

    这一章我们主要介绍一下IbatisNet里面的动态sql语句的运用,比如有时候我们想进行模糊查询,参数是动态加入的.或者要实现top n ,order by ,分页等功能的时候,我们就不得不用动态拼接 ...

  3. 理解js的几个关键问题(1):全局变量new和关于hasOwnPropery和PropertyIsEnumerable 等

    一.作用域和全局变量 var test=function(){ var a=1; setTimeout(function(){ console.log(a); a=2; },1000); a=3; s ...

  4. java中String数组和List的互相转化

    1.List转String数组 方法一: //先准备一个List List<String> testList=new ArrayList<>(); testList.add(& ...

  5. BootStrap学习01框架搭建

    中文文档:https://v3.bootcss.com/css/ 开发工具 WebStorm 一.新建项目08bootstrap 引入bootstrap-3.3.7,引入jQuery,引入holder ...

  6. sqlserver复制表数据到另一个表

    SQL Server中,如果目标表存在: insert into 目标表 select * from 原表; SQL Server中,,如果目标表不存在: select * into 目标表 from ...

  7. python模块以及导入出现ImportError: No module named ‘xxx‘问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  8. poj3207:Ikki's Story IV-Panda's Trick【2-sat tarjan】

    题目大意:圆盘上顺次安放0, 1, 2, …, n – 1的点,每次给出两个点需要连边,可以选择在圆盘的正面连边或在圆盘的反面连边,问是否存在一种方案使得所有连线不相交? 思路:本问题可以等价成:圆盘 ...

  9. COdevs 1251 括号

    时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 计算乘法时,我们可以添加括号,来改变相乘的顺序,比如计算X1, X2, X3, X4 ...

  10. Codeforces Round #296 (Div. 2) D. Clique Problem [ 贪心 ]

    传送门 D. Clique Problem time limit per test 2 seconds memory limit per test 256 megabytes input standa ...