We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
接着上一篇继续介绍开发中用到的相关技术
RxJS 是使用 Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易 Z-Factory中主要是在Service类内使用Observables类型的变量,当某些界面或Service依赖该变量时,可以直接监听该变量并使用Rxjs提供的函数式处理方法,也就是响应式编程 Rxjs中文网
import { Observable } from 'rxjs' // 创建observable var observable = Observable.create(function subscribe(observer) { observer.next(1); observer.next(2); observer.next(3); // observer.error('error'); observer.complete(); }); // 创建观察者:包含3个或部分通知类型的处理函数 var observer = { next: x => console.log('Observer got a next value: ' + x), error: err => console.error('Observer got an error: ' + err), complete: () => console.log('Observer got a complete notification'), } // 订阅:只有subscribe后,observable内部才会执行 const subscription1 = observable.subscribe(observer) // 清理:清除订阅方法(React组件退出时用的多) subscription1.unsubscribe() var button = document.querySelector('button'); // 常规事件监听 button.addEventListener('click', () => console.log('Clicked!')); import { fromEvent } from 'rxjs' // Rxjs创建, fromEvent: 事件对象 + 事件名称 const observable = fromEvent(button, 'click') const callback = data => console.log(data) // 内部将callback函数作为观察者的next方法,并忽略其他类型的通知 const subscription1 = observable.subscribe(callback)
当然使用event回调也可以实现响应回调的功能,但是它们有以下几个不同点
// 分流处理 private getServerErrorSubject(): Observable<IConsoleLog> { return this.serverAgentService.$serverData.pipe( filter((data: IPackage) => (data.action === ServerActions.error)), map((data: IPackage<ErrorPayload>) => this.createLog(LogTypes.studioServer, ConsoleLogLevel.error, data.payload)), ) } private getServerLogSubject(): Observable<IConsoleLog> { return this.serverAgentService.$serverData.pipe( filter((data: IPackage) => (data.action === ServerActions.log)), map((data: IPackage<LogPayload>) => this.createLog(LogTypes.studioServer, ConsoleLogLevel.info, data.payload)) ) } private getRunStatusSubject(): Observable<IConsoleLog> { return this.serverAgentService.$serverData.pipe( filter((data: IPackage) => (data.action === ServerActions.run)), map((data: IPackage<RunningPayLoad>) => { const { status } = data.payload return this.createLog(LogTypes.studioServer, ConsoleLogLevel.info, { text: `当前程序状态:${status}` }) }) ) } // 合并流的结果,汇合 private bindObservable(): Subscription { this.$serverError = this.getServerErrorSubject() this.$serverLog = this.getServerLogSubject() this.$runStatus = this.getRunStatusSubject() this._logSubscription = merge( this.$serverError, this.$serverLog, this.$runStatus, this.$studioLogSubject, ).pipe( tap(data => this.log.debug('receive console data', data)), // 通过scan累计所有日志 scan((logList, log) => { return [...logList, log] }, []) ).subscribe(this.$log) } // 在日志窗口组件中监听 ...... useEffect(() => { const consoleLogService = useService(ConsoleLogService) const subscription = consoleLogService.$log.subscribe(list => { logData.current = list // 定时器节流 setIntervalFlag(true) if (!consolePanelIsShow) { changeConsolePanelIsShow(true) } }) // 返回清理方法 return () => subscription.unsubscribe() }, [ consolePanelIsShow, changeConsolePanelIsShow ])
由状态驱动视图的开发理念越来越普及,复杂应用的开发基本通过管理状态来控制视图。所以在应用初始阶段就应该设计好状态包括状态之间的关联和状态与UI的关系。当然大部分情况下状态管理库已经帮我们做好这些,但是一些复杂的应用还是无法满足,这个时候就需要自己去想解决方案。
整个桌面应用的状态大致包含两部分:界面状态和Service状态
所以状态到界面的传递有以下三种方法
结合一开始的软件整体结构图,整个应用的逻辑、状态、视图还是比较清晰的。其实我们的核心还是没有变,将界面与逻辑的开发分开,通过状态连接两者,将项目的层次结构分清,便于后续的迭代开发。
下一期继续介绍可视化部分的具体实现
The text was updated successfully, but these errors were encountered:
No branches or pull requests
技术背景介绍和选型思考
接着上一篇继续介绍开发中用到的相关技术
Rxjs的使用
理清Rxjs中的几个概念
当然使用event回调也可以实现响应回调的功能,但是它们有以下几个不同点
状态管理
整个桌面应用的状态大致包含两部分:界面状态和Service状态
所以状态到界面的传递有以下三种方法
结合一开始的软件整体结构图,整个应用的逻辑、状态、视图还是比较清晰的。其实我们的核心还是没有变,将界面与逻辑的开发分开,通过状态连接两者,将项目的层次结构分清,便于后续的迭代开发。
The text was updated successfully, but these errors were encountered: