理解koa2 之 async + await + promise
koa是下一代的Node.js web框架。
我们首先使用koa来实现一个简单的hello world吧!假如目前的项目结构如下:
### 目录结构如下:
koa-demo1 # 工程名
| |--- app.js # node 入口文件
| |--- node_modules # 项目依赖包
| |--- package.json
app.js 代码如下:
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next) => {
console.log(ctx);
await next();
ctx.response.type = 'text/html';
ctx.response.body = 'hello world';
});
app.listen(3001);
console.log('app started at port 3001...');
如上,对于页面中每一个http请求,koa将调用如上异步函数来处理。进入项目中的根目录执行 node app.js 后,在页面中访问 http://localhost:3001/ 后刷新看到node控制台打印 console.log(ctx); 如下信息:

参数ctx是koa传入封装的了request和response的变量,如上图可以看到,我们就可以通过ctx来访问request和response的数据了,我们可以再看下浏览器中 header信息如下,我们可以对比下 上面图和下面的图:
并且我们在看看浏览器中网络请求可以看到有如下两条请求,在node中也可以看到打印了二次,说明对于页面中每一个http请求,koa将调用如上异步函数来处理的,如下所示:

如上的代码异步函数中,使用了 await next();来处理下一个异步函数,和express中的 next()方法类似的功能,然后设置 response的Content-Type的内容。
async的理解为:用于声明一个function是异步的,并且返回的是一个promise对象,如下代码:
async function testAsync() {
return 'hello world';
}
const a = testAsync();
console.log(a);
在浏览器中打印如下:

await的含义是:用于等待一个异步方法执行完成(同步等待)。
await在等待async异步方法执行完毕,await必须在async方法中才可以使用。
如下代码demo理解:
function getData () {
return 'hello world';
}
async function testAsync() {
return 'hello xxxx';
}
async function testAsync2() {
const a1 = await testAsync();
const a2 = await getData();
console.log(a1); // hello xxxx
console.log(a2); // hello world
}
testAsync2();
如上代码 getData是同步方法,testAsync是异步方法的,都会返回一条信息,但是在testAsync2异步方法内部,都使用await 使数据同步返回,因此结果打印: hello xxxx;和 hello world了。
但是如果我们在 testAsync2 函数内部不使用 await 这个,直接调用 testAsync()方法和getData()方法的话,那么testAsync就会返回一个promise对象了,如下代码:
function getData () {
return 'hello world';
}
async function testAsync() {
return 'hello xxxx';
}
function testAsync2() {
const a1 = testAsync();
const a2 = getData();
console.log(a1);
console.log(a2);
}
testAsync2();
执行结果如下所示:

1. async的作用是?
async函数它会返回一个promise对象,我们可以通过promise对象的then方法来获取如上的 'hello world' 的值,如下代码所示:
async function testAsync() {
return 'hello xxxx';
}
const test = testAsync();
console.log(test); // Promise {<resolved>: "hello xxxx"}
test.then(data => {
console.log(data); // 打印 hello xxxx
});
2. await的作用是?
await可以理解为同步等待当前的async的执行,且等async后的promise对象执行resolve,然后拿到resolve的值,作为await表达式的运算结果。代码才会继续往下执行。
我们可以看如下demo来理解下:
function testA() {
return 'hello world';
}
async function testA2() {
return 'xxxx';
}
async function testA3() {
// 等待返回 'heelo world'
const a1 = await testA();
// 待会返回promise对象的resolve的值,才会继续往下执行
const a2 = await testA2();
console.log(a1 + '--' + a2); // 会打印 hello world--xxxx
}
testA3();
3. async + await + promise 解决异步问题
如下基本的代码:
let url = 'xxxxx'; // url 地址
let asyncFn = async () => {
let data = null;
data = await getData(url);
console.log(data);
} const getData = function(url) {
return new Promise((resolve, reject) => {
// 如下简单的使用 ajax来演示下,项目中具体使用fetch还是其他都可以的
$.ajax({
type: 'get',
dataType: 'json',
data: { },
success: function(d) {
resolve(d);
},
error: function(e) {
reject(e);
}
})
});
}
理解koa2 之 async + await + promise的更多相关文章
- async await promise 执行时序
先用一个例子来说明async await promise的执行顺序 console.log('start'); async function test(){ console.log('111'); a ...
- 【前端_js】理解 JavaScript 的 async/await
async 和 await 在干什么 任意一个名称都是有意义的,先从字面意思来理解.async 是“异步”的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async ...
- [转] 理解 JavaScript 的 async/await
[From] https://segmentfault.com/a/1190000007535316 边城 2016年11月19日发布 随着 Node 7 的发布,越来越多的人开始研究据说是 ...
- 深入理解理解 JavaScript 的 async/await
原文地址:https://segmentfault.com/a/1190000007535316,首先感谢原文作者对该知识的总结与分享.本文是在自己理解的基础上略作修改所写,主要为了加深对该知识点的理 ...
- 理解 JavaScript 的 async/await
随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中.C# ...
- async await promise
async 异步函数,以后可能会用得很广. 1.箭头函数: 没有{ }时不写return 也有返回值 2.Promise : 异步神器,很多异步api都是基于Promise 3.new Promise ...
- 理解 js的 async/await
async 和await 在干什么? async 用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中 await ...
- Async/await promise实现
An async function can contain an await expression that pauses the execution of the async function an ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
随机推荐
- vue从入门到进阶:计算属性computed与侦听器watch(三)
计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...
- windows10系统关闭自动更新服务
一.关闭Windows10系统的自动更新服务 1:使用快捷键Win+R,打开运行 2:输入命令:services.msc,打开系统服务界面 找到Windows Update双击 将启动类型改为[禁用] ...
- GeoServer中使用样式化图层描述符(sld)给WMS加注记
现有一个shp格式的道路注记文件,用点来表示注记的位置,属性表中保存每个点对应的字,在QGIS中打开如下图所示 它的属性表如下 现需要把道路数据和它的注记发布为WMS服务,通过GeoServer直接发 ...
- MySQL 横向表分区之RANGE分区小结
MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...
- echarts雷达图点击事件 包含(2.x,3.85,4.02)测试
最近看见别人问的问题,点击雷达图的拐点,获取点击数据的问题,直接上代码. echarts 2x 的点击事件 echarts配置问题:https://www.douban.com/note/509404 ...
- c#判断两个对象和对象中的属性是否相同(以及记录对象中的哪些字段,和详细的改变情况)
当前项目需要记录变更记录,即用户在进行编辑后,将变更操作记录下来.但是数据没有发生变化,则不记录. 代码1:(仅仅返回是否变化的标识) /// <summary> /// 反射对比实体属性 ...
- IE浏览器兼容性调整总结技巧
前言 最近项目做完,用户需要兼容IE,于是开展了兼容性的调整工作.边调整边想感叹IE真是个沙雕..特将我遇到的问题记录下来,以及记录我的解决办法,以下问题及解决办法,都是真实可用的,本人亲测~~ 一. ...
- java开发基础知识学习
java环境配置 classpath: .当前目录 path: java 命令所在目录 jdk安装目录 jdk/bin jre安装目录 jre/bin 安装JDK后配置环境变量如下: 安装过程用到了j ...
- Json.net日期格式化设置
Json.net默认的时间格式化后带T,不符合一般的业务要求,重新设置JSON.NET的默认日期格式化方式,代码如下: /// <summary> /// Json.net默认转换设置 / ...
- postgre中类似oracle的sql%rowcount用法
get diagnostics cnt := row_count; 现在有两个表tab1和tab2,两个表的格式相同,tab1中有1000条数据,tab2中0条数据 创建测试功能函数 create o ...