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. linux中的grep命令用法

    原文请移驾:http://blog.csdn.net/greytree/article/details/428532 grep -- print lines matching a pattern (将 ...

  2. sql的case when用法

    select t.C_OPERATE_TIME MODIFY_TIME, t.c_code EMPLOYEE_CODE, t.c_name EMPLOYEE_NAME, CASE t.c_employ ...

  3. 【转】关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...

  4. POJ 2115 C Looooops【数论】

    很容易看出来一个同余式,说到底是解一个线性同余方程,计算机解通常有拓展欧几里得和欧拉定理两种算法,参照去年的NOIP水题,问题是这题数据范围是2^32所以要int64 TAT #include< ...

  5. 1027 stl

    #include<stdio.h> #include<queue> using namespace std; int main() {  int i,n,m,j,k,a[100 ...

  6. bzoj 2721[Violet 5]樱花 数论

    [Violet 5]樱花 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 671  Solved: 395[Submit][Status][Discuss ...

  7. [NOIP2002] 提高组 洛谷P1031 均分纸牌

    题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...

  8. BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉

    L<=1000000的土地上用长度在2*A~2*B的线段覆盖所有点,且给定n<=1000个区间,每个区间上只允许有一条线段,求最少多少线段,无解-1. f[i]表示填前i个土地最少线段,f ...

  9. Android视图组成View

    视图组成View 创建时间: 2013-9-13 10:51 更新时间: 2013-9-13 11:04

  10. 胜利大逃亡--hdu --1253(bfs)

    Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C ...