为了账号安全,请及时绑定邮箱和手机立即绑定

koa2源码阅读的一点问题

koa2源码阅读的一点问题

ibeautiful 2019-03-01 18:27:39
在阅读koa2的源码过程中,读到了application里面的一个callback方法,因为这个方法是返回createServer所需要的回调函数的,就对其中的一句代码感到了不理解,就是handleRequest里面为什么需要return this.handleRequest(ctx, fn)呢。不return直接执行好像也没有问题    callback() {        const fn = compose(this.middleware);        if (!this.listeners('error').length) this.on('error', this.onerror);        const handleRequest = (req, res) => {            const ctx = this.createContext(req, res);            return this.handleRequest(ctx, fn);        };        return handleRequest;    }有懂的大神帮忙解答下吗,多谢了!
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

结论:在绝大多数情况下,这个return是没有任何实际作用的,除了一些特殊的场景,比如从express迁移到koa。


看具体例子:


const http = require('http');

const koa = require('koa');

const koaApp = new koa();


koaApp.use(async ctx => {

  ctx.body = 'call api';

});


const koaCallback = koaApp.callback();


const express = require('express');

const expressApp = express();


expressApp.use('/api', (req, res, next) => {

  koaCallback(req, res)

    .then(() => {

      console.log('api is called');

    })

});


expressApp.listen(3000);

return this.handleRequest(ctx, fn)返回了promise实例,方便开发者后续的操作(在请求处理完成之后)。


当然,上面的例子因为比较简单,不一定要用.then()也能实现。只不过返回Promise实例,编码起来会方便很多。


比如你想在koa处理完请求后做一些事情,如果没有return的话,你需要些一些比较恶心繁琐的代码来判断请求是否已经处理完。


查看完整回答
反对 回复 2019-03-12
  • 2 回答
  • 0 关注
  • 521 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信