鍍金池/ 問答/HTML/ koa2源碼閱讀的一點(diǎn)問題

koa2源碼閱讀的一點(diǎn)問題

在閱讀koa2的源碼過程中,讀到了application里面的一個callback方法,因為這個方法是返回createServer所需要的回調(diào)函數(shù)的,就對其中的一句代碼感到了不理解,就是handleRequest里面為什么需要return this.handleRequest(ctx, fn)呢。不return直接執(zhí)行好像也沒有問題

    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;
    }

有懂的大神幫忙解答下嗎,多謝了!

回答
編輯回答
眼雜

結(jié)論:在絕大多數(shù)情況下,這個return是沒有任何實(shí)際作用的,除了一些特殊的場景,比如從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實(shí)例,方便開發(fā)者后續(xù)的操作(在請求處理完成之后)。

當(dāng)然,上面的例子因為比較簡單,不一定要用.then()也能實(shí)現(xiàn)。只不過返回Promise實(shí)例,編碼起來會方便很多。

比如你想在koa處理完請求后做一些事情,如果沒有return的話,你需要些一些比較惡心繁瑣的代碼來判斷請求是否已經(jīng)處理完。

2017年10月12日 18:20
編輯回答
晚風(fēng)眠

看return有沒有作用看調(diào)用的地方
createServer是不需要返回值的

2017年10月26日 08:43
編輯回答
失魂人

這里的this.handleRequest指的不是上面剛定義的handleRequest,而是ApplicationhandleRequest方法。

 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);
  }

https://github.com/koajs/koa/...

至于作用,大概是返回一個promise,依次調(diào)用之前傳遞的中間件,同時帶有一個默認(rèn)的錯誤處理中間件

2017年12月13日 20:55