栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

koa中next的原理是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

koa中next的原理是什么?

next
是函数,返回的是
promise

app.use(async (ctx, next) => { console.log(1); await next(); console.log(2);});

use
把函数放进
this.middleware
中,
listen
时,
compose
koa-compose
,转换。

class Application extends Emitter {  // 代码有简化组合  listen(){    const  fnMiddleware = compose(this.middleware);    fnMiddleware(ctx).then(handleResponse).catch(onerror);  }, use(fn){  this.middleware.push(fn);  return this; }}

koa-compose
源码

function compose (middleware) {  // 校验middleware 是数组和数组每一项都是函数的校验  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')  for (const fn of middleware) {    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')  }  return function (context, next) {    // last called middleware #    let index = -1    return dispatch(0)    function dispatch (i) {      if (i <= index) return Promise.reject(new Error('next() called multiple times'))      index = i      let fn = middleware[i]      if (i === middleware.length) fn = next      if (!fn) return Promise.resolve()      try {        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));      } catch (err) {        return Promise.reject(err)      }    }  }}

移除一些校验和报错代码翻译下就是这样,也就是常说的洋葱模型

// simpleKoaComposeconst [fn1, fn2, fn3] = this.middleware;const fnMiddleware = function(context){    return Promise.resolve(      fn1(context, function next(){        return Promise.resolve(          fn2(context, function next(){   return Promise.resolve(       fn3(context, function next(){         return Promise.resolve();       })   )          })        )    })  );};fnMiddleware(ctx).then(handleResponse).catch(onerror);

具体源码可以看我这篇文章。
若川:学习 koa 源码的整体架构,浅析koa洋葱模型原理和co原理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367671.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号