大佬教程收集整理的这篇文章主要介绍了koa2 总体流程原理浅析(二) 之 中间件原理,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
handlerequest(ctx,fnMiddlewarE) { const res = ctx.res; res.statusCode = 404; const onerror = err => ctx.onerror(err); const handleResponse = () => respond(ctX); onFinished(res,onerror); return fnMiddleware(ctX).then(handleResponsE).catch(onerror); }
res.end(body)
fnMiddleware(ctX)
就是执行所有中间件函数,然后返回一个 Promise 对象,不出错的话执行 handleResponse
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 // 返回给 next() if (!fn) return Promise.resolve() try { // 返回给 next(),最外一层返回给 fnMiddleware(ctX).then(handleResponsE) return Promise.resolve(fn(context,function next () { // 返回给外一层 fn 的 await return dispatch(i + 1) })) } catch (err) { return Promise.reject(err) } } }
fnMiddleware(ctX).then(handleResponsE)
)index
,是记录执行过的中间件数量。一旦有序号大于数量,说明有中间件执行了两次 await next
,这是不被允许的function dispatch(0){ // 第一层的序号 return Promise.resolve(async function a0(){ cnosole.log('0-0') await 111(function next0(){ return (function dispatch(1){ // 第二层的序号 return Promise.resolve(async function a1(){ cnosole.log('1-0') await 222(function next1(){ return (function dispatch(2){ // 第三层的序号 return Promise.resolve(async function a2(){ cnosole.log('2-0') await 333(function next2(){ return (function dispatch(3){ // i == middleware.length ,算是洋葱芯吧 // fn[3] == undefined,说明中间件已经到洋葱的最里面了,开始向外返回 return Promise.resolve() })() })()333 console.log('2-1') }) })() })()222 console.log('1-1') }) })() })()111 console.log('0-1') }) } dispatch(0).then(handleResponsE)
app.use(async function (ctx,next) { console.log('1-1') await new Promise(function(resolve,reject){ setTimeout(function () { console.info ("wait for 10 mini seconds."); resolve(); },10); }); console.log('1-2') next(); console.log('1-3') }) app.use(async function (ctx,next) { console.log('2-1') await new Promise(function(resolvE){ setTimeout(function () { console.info ("wait for 10 mini seconds"); resolve(); },10); }); console.log('2-2') next(); console.log('2-3') })
以上是大佬教程为你收集整理的koa2 总体流程原理浅析(二) 之 中间件原理全部内容,希望文章能够帮你解决koa2 总体流程原理浅析(二) 之 中间件原理所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。