zoukankan      html  css  js  c++  java
  • koa 中,中间件异步与同步的相关问题

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

     1 const Router = require('koa-router')
     2     , koa = new Router({ prefix: '/koa' })
     3 
     4     , fs = require('fs')
     5 ;
     6 /* 中间件执行顺序 与异步中间件 */
     7 const one = (ctx, next) => {
     8     console.log('>> one');
     9     next();
    10     console.log('<< one');
    11 };
    12 
    13 const two = (ctx, next) => {
    14     console.log('>> two');
    15     next();
    16     console.log('<< two');
    17 };
    18 
    19 const three = (ctx, next) => {
    20     console.log('>> three');
    21     next();
    22     console.log('<< three');
    23 };
    24 
    25 koa['get']('/middleStack', one, two, three, async (ctx) => {
    26     console.log('>> four');
    27     ctx.response.type = 'html';
    28     let aaa = 'aa';
    29     console.log('<< four');
    30     ctx.response.body = aaa;
    31 });

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

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

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

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

    则控制台打印顺序为:

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

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

     1 /* 中间件执行顺序 与异步中间件 */
     2 const one = async (ctx, next) => {
     3     console.log('>> one');
     4     await next();
     5     console.log('<< one');
     6 };
     7 
     8 const two = async (ctx, next) => {
     9     console.log('>> two');
    10     await next();
    11     console.log('<< two');
    12 };
    13 
    14 const three = async (ctx, next) => {
    15     console.log('>> three');
    16     await next();
    17     console.log('<< three');
    18 };
    19 
    20 koa['get']('/middleStack', one, two, three, async (ctx) => {
    21     console.log('>> four');
    22     ctx.response.type = 'html';
    23     let aaa = await fs.openSync('./public/index.html','r');
    24     console.log('<< four');
    25     ctx.response.body = aaa;
    26 });

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

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

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

  • 相关阅读:
    判断一个序列是否是另一个序列的前缀
    Ant-打增量包
    cas-单点登录-应用说明
    firebug离线安装方法-拖入法
    oracle-获取数据库中所有表的注释 comments
    跨浏览器的placeholder – 原生JS版
    birt IE8 IE9 兼容问题
    websphere部署--web应用-以自己的项目为例
    JSP-页面跳转大全
    Oracle中Union与Union All的区别(适用多个数据库)
  • 原文地址:https://www.cnblogs.com/ndos/p/9541817.html
Copyright © 2011-2022 走看看