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的更多相关文章

  1. async await promise 执行时序

    先用一个例子来说明async await promise的执行顺序 console.log('start'); async function test(){ console.log('111'); a ...

  2. 【前端_js】理解 JavaScript 的 async/await

    async 和 await 在干什么 任意一个名称都是有意义的,先从字面意思来理解.async 是“异步”的简写,而 await 可以认为是 async wait 的简写.所以应该很好理解 async ...

  3. [转] 理解 JavaScript 的 async/await

    [From] https://segmentfault.com/a/1190000007535316      边城 2016年11月19日发布 随着 Node 7 的发布,越来越多的人开始研究据说是 ...

  4. 深入理解理解 JavaScript 的 async/await

    原文地址:https://segmentfault.com/a/1190000007535316,首先感谢原文作者对该知识的总结与分享.本文是在自己理解的基础上略作修改所写,主要为了加深对该知识点的理 ...

  5. 理解 JavaScript 的 async/await

    随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中.C# ...

  6. async await promise

    async 异步函数,以后可能会用得很广. 1.箭头函数: 没有{ }时不写return 也有返回值 2.Promise : 异步神器,很多异步api都是基于Promise 3.new Promise ...

  7. 理解 js的 async/await

    async 和await 在干什么? async  用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中  await ...

  8. Async/await promise实现

    An async function can contain an await expression that pauses the execution of the async function an ...

  9. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

随机推荐

  1. verilog实现红黄蓝三秒灯

    代码如下 test.v文件 led.v文件 module test(); wire led_r,led_g,led_b; ; clk <= ~clk; led c1 ( .clk(clk), . ...

  2. Apktool(3)——Apktool的使用

    一.apktool的作用 安卓应用apk文件不仅仅是包含有resource和编译的java代码的zip文件,如果你尝试用解压工具(如好压)解压后,你将会获得classes.dex和resource.a ...

  3. 第一篇-Html标签中head标签,body标签中input系列,textarea和select标签

    第十四周课程(1-12章节) HTML 裸体 CSS   穿华丽衣服 Javascript 动起来 一 HTML (20个标签) 1.我们的浏览器是socket客户端 2.一套规则,浏览器认识的规则 ...

  4. Spring MVC 拦截器 (十)

    完整的项目案例: springmvc.zip 目录 实例 除了依赖spring-webmvc还需要依赖jackson-databind(用于转换json数据格式) <!--json-->& ...

  5. 极致精简的webservice集成例子

    极致精简的webservice例子   看了网上好多关于webservice的例子,基本上对初学者来说都是模棱两可云里雾里,现在,我将网上关于webservice的讲解提炼出来,通过一个最简单使用并且 ...

  6. Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)

    1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...

  7. Lua无法排序的问题(Key需要是连续的)

    排序的Key需要是连续的 local x = {[1]={x=6}, [2]={x=5}, [3]={x=7}, [5]={x=2}, [6]={x=8}, [7]={x=5}} ---从小到大排序 ...

  8. Centos7安装搭建FTP服务器(最简便方法)

    简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点. vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linu ...

  9. CentOS7安装redis数据库及php-redis扩展

    redis 首先把redis安装到服务器中 1.wget http://download.redis.io/redis-stable.tar.gz 下载redis源码 2. tar xvzf redi ...

  10. LeetCode算法题-Ransom Note(Java实现)

    这是悦乐书的第212次更新,第225篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383).给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串 ...