同步中间件很容易理解,如以下代码:

 const Router = require('koa-router')
, koa = new Router({ prefix: '/koa' }) , fs = require('fs')
;
/* 中间件执行顺序 与异步中间件 */
const one = (ctx, next) => {
console.log('>> one');
next();
console.log('<< one');
}; const two = (ctx, next) => {
console.log('>> two');
next();
console.log('<< two');
}; const three = (ctx, next) => {
console.log('>> three');
next();
console.log('<< three');
}; koa['get']('/middleStack', one, two, three, async (ctx) => {
console.log('>> four');
ctx.response.type = 'html';
let aaa = 'aa';
console.log('<< four');
ctx.response.body = aaa;
});

以上代码在控制台一次打印:

>> one
>> two
>> three
>> four
<< four
<< three
<< two
<< one

如果将其中一个中间件改为异步中间件:

 koa['get']('/middleStack', one, two, three, async (ctx) => {
console.log('>> four');
ctx.response.type = 'html';
let aaa = await fs.openSync('./public/index.html','r');
console.log('<< four');
ctx.response.body = aaa;
});

则控制台打印顺序为:

>> one
>> two
>> three
>> four
<< three
<< two
<< one
<< four

同步中间件并不会等待异步中间件返回结果才继续 next 之后的代码,若将所有的中间件都改为异步中间件:

 /* 中间件执行顺序 与异步中间件 */
const one = async (ctx, next) => {
console.log('>> one');
await next();
console.log('<< one');
}; const two = async (ctx, next) => {
console.log('>> two');
await next();
console.log('<< two');
}; const three = async (ctx, next) => {
console.log('>> three');
await next();
console.log('<< three');
}; koa['get']('/middleStack', one, two, three, async (ctx) => {
console.log('>> four');
ctx.response.type = 'html';
let aaa = await fs.openSync('./public/index.html','r');
console.log('<< four');
ctx.response.body = aaa;
});

>> one
>> two
>> three
>> four
<< four
<< three
<< two
<< one

打印顺序又回到所有的中间件为同步中间件的情况。

总结:在 koa 变成中,尽量将所有的中间件都些为异步中间件,使得执行顺序是可控可理解的。

koa 中,中间件异步与同步的相关问题的更多相关文章

  1. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  2. C#中的异步和同步

    同步 同步(英语:Synchronization [ˌsɪŋkrənaɪ'zeɪʃn]),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象.说白了就是多个任务一 ...

  3. js中的异步与同步,解决由异步引起的问题

    之前在项目中遇到过好多次因为异步引起的变量没有值,所以意识到了认识js中同步与异步机制的重要性 在单线程的js中,异步代码会被放入一个事件队列,等到所有其他代码执行后再执行,而不会阻塞线程. 下面是j ...

  4. C# 中HttpClient的使用中同步异步问题

    项目中遇到了这样的问题: 第一次 :HttpResponseMessage response = await httpClient.PostAsync(url, null);发送了一个post异步请求 ...

  5. ajax中的async属性值之同步和异步及同步和异步区别

    jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...

  6. 深入理解 JS 引擎执行机制(同步执行、异步执行以及同步中的异步执行)

    首先明确两点: 1.JS 执行机制是单线程. 2.JS的Event loop是JS的执行机制,深入了解Event loop,就等于深入了解JS引擎的执行. 单线程执行带来什么问题? 在JS执行中都是单 ...

  7. koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据

    1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...

  8. 深入探析koa之中间件流程控制篇

    koa被认为是第二代web后端开发框架,相比于前代express而言,其最大的特色无疑就是解决了回调金字塔的问题,让异步的写法更加的简洁.在使用koa的过程中,其实一直比较好奇koa内部的实现机理.最 ...

  9. 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步

    深入理解MVC   MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...

随机推荐

  1. window本地运行mapreduce程序

    mapreduce的运行方式一般有两种,一是从本地导出一个jar包,在传到虚拟机上运行,这样调试起来非常的不方便,如果出现错误就需要重新导出jar包. 第二种方式是在本地直接运行,但是在运行前需要进行 ...

  2. Linux开发端口的基本操作命令

    Linux端口操作命令 查看开放端口:firewall-cmd --list-all 开发8080端口 --permanent 代码永久开发:firewall-cmd --add-port=8080/ ...

  3. LruCache源码分析

    LRU(Least Recently Used)是一种很常用的资源调度策略,与20/80原则契合,在资源达到上限时倾向保留最近经常访问的资源对象. Android中基于LRU实现了缓存对象,即LruC ...

  4. mysql互为主从实战设置详解及自动化备份(Centos7.2)

    mysql互为主从实战设置详解(Centos7.2) 第一步:mysql配置  my.cnf配置 服务器1 (10.89.10.90) [mysqld]  server-id=1  log-bin=/ ...

  5. grep常用用法

    grep常用用法 [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件 ...

  6. web测试总结—用户体验

    一.什么是用户体验 用户体验,英文叫做user experience,缩写为UE,或者UX.一个较常见的定义是“指用户访问一个网站或者使用一个产品时的全部体验.他们的印象和感觉,是否成功,是否享受,是 ...

  7. 慕课网Python基础学习整理

    # -*- coding: utf-8 -*- """# Python的注释以 # 开头,后面的文字直到行尾都算注释;多行注释开头3个 " 结尾3个 " ...

  8. SPSS学习系列之SPSS Modeler Server是什么?

    不多说,直接上干货! SPSS Modeler 使用客户端/服务器体系结构将资源集约型操作的请求分发给功能强大的服务器软件,因而使大数据集的传输速度大大加快.除了此处所列的产品和更新,也可能还有其他可 ...

  9. 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组

    马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...

  10. 使用C# 开始第一个QQ机器人

    本示例将会使用”嘤鹉学舌”这个小插件的实现来演示如何使用Newbe.Mahua实现第一个机器人插件. 插件功能 自动将发送者的消息回发给发送人,嘤鹉(Parrot,其实是说嘤嘤嘤怪)学舌. 开发环境要 ...