# 3. koa2洋葱模型

# 1. koa 框架 await 实现原理

use 的时候把中间推到一个中间件数组,核心方法是 compose(this.middleware) 返回一个 promise,处理完毕后再执行 handleResponse,compose 的核心方法是返回一个函数,函数的核心是返回 dispatch 函数 更多关于组合函数看这里(opens new window)

compose() {
    return async ctx => {
    // createNext函数的作用就是将上一个中间件的next当做参数传给下一个中间件,并且
    // 将上下文ctx绑定当前中间件,当中间件执行完,调用next()的时候,其实就是去执行下一个中间件
        function createNext(middleware, oldNext) {
            return async () => {
                await middleware(ctx, oldNext);
            }
        }
        let len = this.middlewares.length;
        let next = async () => {
            return Promise.resolve();
        };
        // 链式反向递归模型的实现,i是从最大数开始循环的,将中间件从最后一个开始封
        // 装,每一次都是将自己的执行函数封装成next当做上一个中间件的next参数,这样
        // 当循环到第一个中间件的时候,只需要执行一次next(),就能链式的递归调用所有中间件
        for (let i = len - 1; i >= 0; i--) {
            let currentMiddleware = this.middlewares[i];
            next = createNext(currentMiddleware, next);
        }
        await next();
    };
}

# 2. node 异步任务怎么执行

node.js 的异步机制是基于事件的,所有的 I/O、网络通信、数据库查询都以非阻塞的方式执行,返回结果由事件循环来处理。node.js 在同一时刻只会处理一个事件,完成后立即进入事件循环检查后面事件。这样 CPU 和内存在同一时间集中处理一件事,同时尽量让耗时的 I/O 等操作并行执行。 链接(opens new window)

# 3. node 的 Buffer、Stream

a. Buffer 就是在内存中开辟一段空间,用来装数据的

b.数据都是二进制的,记住电信号(010101)

c. Stream 的三大原则:有源头、有终点、源头流向终点。

d.Stream 就像司机,它的作用就是将装着数据的 Buffer 开向终点

# 4. nodejs 在什么场景下使用?是阻塞还是非阻塞的?

非阻塞的,采用事件机制。NodeJS 适合运用在高并发、I/O 密集、少量业务逻辑的场景。

# 5. nodejs 如何开启多线程?

利用 cluster 模块