You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
use(fn) {
if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
if (isGeneratorFunction(fn)) {
deprecate('Support for generators will be removed in v3. ' +
'See the documentation for examples of how to convert old middleware ' +
'https://github.com/koajs/koa/blob/master/docs/migration.md');
fn = convert(fn); // 转换成一个promise对象
}
debug('use %s', fn._name || fn.name || '-');
this.middleware.push(fn);
return this;
}
有点忘记generator了,再看了一下es6
遍历嵌套数组
function* flat (arr) {
for (var i = 0; i < arr.length; i++) {
let item = arr[i];
if (item instanceof Array) {
yield* flat(item);
} else {
yield item;
}
}
}
const arr = [1, [2, 3], 4, [5, 6, [7, 8]]];
for (let val of flat(arr)) {
console.log(val)
}
判断是否为generator function
function isGeneratorFunction(fn) {
if (typeof fn !== 'function') {
return false;
}
if (isFnRegex.test(fnToStr.call(fn))) { // 正则表达式/^\s*(?:function)?\*/
return true;
}
if (!hasToStringTag) { // 不支持Symbol
var str = toStr.call(fn);
return str === '[object GeneratorFunction]';
}
return getProto(fn) === GeneratorFunction;
}
入口application.js
简化代码:
从实例属性上手,看context,request,response分别是什么
context.js
在context.js中导出了一个proto对象,并将一些属性代理到
context.request
和context.response
上比如:
这是怎么做到的呢??
发现问题:
Delegator
中getter
方法中的__defineGetter__
,建议用Object.defineProperty
代替request.js
一系列的getter和setter
response.js
也是一系列的getter和setter, 略过
toJSON中的only方法:
将obj中的属性取出赋值到ret对象并return。这里用到了reduce方法。
带着问题出发,深究use方法
先看use方法
有点忘记generator了,再看了一下es6
遍历嵌套数组
接着listen
koa/application.js
此间,
http.createServer(this.callback())
是一个很庞大的函数体下面我们来理一理:
http.createServer
new Server(requestListener)
采用倒推法 ,既然这儿已经注册了
request
的监听器,那么去找哪里emit('request')
_http_server.js中
由下往上读
找到了源头,这儿先监听了
connection
事件,等connection
触发之后再触发的request
事件,接下来我们来看看哪里触发的在net.js中
这儿有个疑问,这儿的parser又是什么呢 ?parser原来实在
_http_common.js
中实例化的对象_http_common.js中导出了上述的parsers
internal/freelist.js解释了new FreeList()实际返回一个callback()返回的对象,即上述的HTTPParser实例
_http_server.js
导出的Server。此Server又继承自net.Server
简单介绍一下
net.Server
:回到koa/application看this.callback()
compose函数每次next则dispatch下一个中间件
自己造了一个compose
最后执行
The text was updated successfully, but these errors were encountered: