Koa2学习(二)async/await
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的更多相关文章
- JS学习- ES6 async await使用
async 函数是什么?一句话,它就是 Generator 函数的语法糖. 使用场景常常会遇到,请求完一个接口,拿完值再去请求另外一个接口,我们之前回调callback函数处理,如果很多的情况下,看起 ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- ES6-11学习笔记--async,await
基于Generator异步编程语法糖:async await async默认输出Promise对象 将异步的代码以同步的方式书写,提高代码可阅读性 基本使用: function timeout() ...
- koa2学习(二) 中间件router
中间件 koa-router 安装 npm install --save koa-router 使用 const Koa = require('koa'); const Router = requir ...
- Async/Await是这样简化JavaScript代码的
译者按: 在Async/Await替代Promise的6个理由中,我们比较了两种不同的异步编程方法:Async/Await和Promise,这篇博客将通过示例代码介绍Async/Await是如何简化J ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
随机推荐
- finally块的问题(finally block does not complete normally)
http://blog.csdn.net/chh_jiang/article/details/4557461 当finall块中包含return语句时,Eclipse会给出警告“finally blo ...
- 算法导论 第六章 2 优先队列(python)
优先队列: 物理结构: 顺序表(典型的是数组){python用到list} 逻辑结构:似完全二叉树 使用的特点是:动态的排序..排序的元素会增加,减少#和快速排序对比 快速一次排完 增 ...
- C#中对泛型List进行分组输出元素
背景:在输出列表时,往往需要按照某一字段进行分组,比如在输出城市列表时,按照首字母进行分组,输出学生列表时,按照年级进行分组,然后再对分组的结果按照其他的字段进行排序. 如存在以下STU学生类,代码如 ...
- NGINX模块(二)
[Nginx标准HTTP模块] 一.HTTP核心模块 指令1:alias 语法:alias file-path|directory-path; 默认值:no 使用字段:location 说明:这个指令 ...
- Leetcode 307.区域检索-数组可修改
区域检索-数组可修改 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. update(i, val) 函数可以通过将下标为 i 的 ...
- CSU 1307 最短路+二分
题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或 ...
- 如何打开Oracle的dmp文件
在工作中经常使用到别人提供过来的dmp文件,由于不知道备份时所用的用户名,这样就不能恢复. 通过打开DMP文件可以查看到备份时使用的用户名. 1.如果dmp文件比较小,用文本编辑器打开就可以了. 2. ...
- 洛谷—— P1098 字符串的展开
https://www.luogu.org/problem/show?pid=1098 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类 ...
- [Bzoj1767][Ceoi2009]harbingers (树上斜率优化)
1767: [Ceoi2009]harbingers Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 451 Solved: 120[Submit][S ...
- C# 读自己的资源文件
Assembly assm = this.GetType().Assembly;//Assembly.LoadFrom(程序集路径); foreach (string resName in assm. ...