关于执行顺序的问题
来源:10-17 -总结
凛凛凛世
2020-04-29
老师,这一段数组合并应该是有问题的,这样操作会导致use方法传来的中间件先执行然后再执行get或者post中的中间件方法
我想到的解决方案是在register函数里面设置一个自增量作为info的属性来判断顺序
改进后的代码
constructor() {
// 存放中间件的列表
this.routes = {
// use的方法存放在all里面
all: [],
// get的方法存放在get里面
get: [],
// post的方法都放在post里面
post: []
}
this.times = 0
}
// 用来分析第一个参数
register(path) {
const info = {}
// 没有输入第一个参数就是根路由 arguments就是function
info.times = this.times++
if(typeof path === 'string'){
info.path = path
info.stack = slice.call(arguments, 1)
}else{
info.path = '/'
info.stack = slice.call(arguments, 0)
}
return info
}
match(method, url){
let stack = []
if(url === '/favicon.ico'){
return stack
}
// 获取route
let curRoutes = []
// FIXME
let curTime = 0
let curAll = 0
let curMethod = 0
while(curTime < this.times) {
console.log(curTime)
if (this.routes.all.length === 0) {
curRoutes = curRoutes.concat(this.routes[method])
break
} else if (this.routes[method].length === 0) {
curRoutes = curRoutes.concat(this.routes.all)
break
} else if (this.routes.all[curAll] && this.routes.all[curAll].times === curTime){
curRoutes.push(this.routes.all[curAll])
curAll++
curTime++
} else if (this.routes[method][curMethod] && this.routes[method][curMethod].times === curTime){
curRoutes.push(this.routes[method][curMethod])
curMethod++
curTime++
// 没有匹配
} else {
curTime++
continue
}
}
// curRoutes = curRoutes.concat(this.routes.all)
// // curRoutes = curRoutes.concat(this.routes[method])
// console.log(this.routes.all)
// console.log(this.routes[method])
curRoutes.forEach(routeInfo => {
// 如果根目录==='/api' url==='/api/get-cookie'
// 用来判断这个条件成立就push进stack
if(url.indexOf(routeInfo.path) === 0) {
//routeInfo => curRoutes => this.routes.xx => register/info
stack = stack.concat(routeInfo.stack)
}
})
return stack
}
老师你看一下这样可行吗,还有没有什么问题
写回答
2回答
-
自胜者强123
2022-06-22
同学,我看你的代码写得太复杂了,不好理解,我的解决方案是添加一个属性sort
constructor() { // 存放中间件 this.routes = {...} this.sort = 0 } register(path) { const info = {} ....... info.sort = this.sort this.sort++ return info } match(method, url) { ........ // 获取routes let curRoutes = [] curRoutes = curRoutes.concat(this.routes.all) curRoutes = curRoutes.concat(this.routes[method]) // 排序 curRoutes = curRoutes.sort((a, b) => a.sort - b.sort) curRoutes.forEach.... return stack }
// 排序 curRoutes = curRoutes.sort((a, b) => a.sort - b.sort)
最后排序一下连接的数组就可以了
00 -
双越
2020-04-29
看代码逻辑没啥问题。运行测试一下,如果 OK 那就可以。
00
相似问题