实现一个事件总线,要求满足一下特性:
- 简单的回调注册和事件触发。
// 注册
bus.on('event', function listener1(arg1, arg2) { ... } )
// 触发
bus.trigger('event', arg1, arg2)
- 同一事件下,回调可以指定顺序。要求有检测错误的能力。
bus.on('event', function listener1() { ... } )
bus.on('event', {
fn: function listener2() { ... }
before: ['listener1']
})
- 之间回调中可以再触发事件,事件完整结束后能打印出完整调用栈,异步调用栈信息也要打印。
bus.on('event1', function() {
// 以下只是伪码,具体 api 可以根据需要自行设计。
bus.tigger('event2')
new Promise(function(resolve){
setTimeout(function(){
bus.trigger('event3')
}, 1000)
})
})
bus.on('event2', function() {
// do anything
bus.trigger('event4')
})
result = bus.trigger('event1')
result.then(function( callStack ){
// 要求在 callStack 中正确描述 event1 回调中同步触发了 event2 ,异步触发了 event3。
// 同时要描述 event2 中触发了 event4。
})
====================================== 附加题:实现一个简单的类 graphQL parser。
- 简单查询
const inputStr = `User {
id,
name,
age
}`
console.log( parse(inputStr) )
/*
期望输出:
{
type: 'User',
fields : ['id','name','age']
}
*/
- 查询和关联查询
const inputStr = `User( age:21 ){
id,
name,
assigned Task( content: 'run' ): {
id,
content
}
}`
console.log( parse(inputStr) )
/*
期望输出:
{
type : 'User',
attrs : {
data : {
age :21
}
},
fields : ['id', 'name'],
relations : {
'assigned Task' : {
name : 'assigned',
target : {
type : 'Task',
attrs : {
data : {
content : 'run'
}
},
fields : ['id','content']
}
}
}
}
*/