使用 RxJS 在 TypeScript 中创建 BaseObserver

Posted

技术标签:

【中文标题】使用 RxJS 在 TypeScript 中创建 BaseObserver【英文标题】:Create BaseObserver in TypeScript using RxJS 【发布时间】:2019-05-22 09:30:40 【问题描述】:

在 Swift 中我创建了 BaseObserver,在订阅方法中我通过了这个类。 我正在尝试使用 TypeScript 在 RxJS 中做同样的事情。

当您想在任何事件发生之前和之后做某事时,这很方便。

import Foundation
import RxSwift

class BaseObserver<Element>: ObserverType 

    public typealias E = Element

    var beforeClosure: (() -> Void)?
    var completeClosure: ((E) -> Void)?
    var errorClosure: ((Error) -> Void)?
    var completedClosure: (() -> Void)?
    var alwaysClosure: (()->())?
    var onCompleteOrError: ((Error?) -> Void)?

    init(beforeComplete: (() -> Void)? = nil, onComplete: ((E) -> Void)? = nil, onError: ((Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, always: (()->())? = nil, onCompleteOrError: ((Error?) -> Void)? = nil) 
        self.alwaysClosure = always
        self.completeClosure = onComplete
        self.errorClosure = onError
        self.completedClosure = onCompleted
        self.beforeClosure = beforeComplete
        self.onCompleteOrError = onCompleteOrError
    

    func on(_ event: Event<Element>) 
        switch event 
        case .next(let element):
            beforeClosure?()
            completeClosure?(element)
        case .error(let error):
            beforeClosure?()
            errorClosure?(error)
            onCompleteOrError?(error)
        case .completed:
            completedClosure?()
            onCompleteOrError?(nil)
        
        alwaysClosure?()
    

【问题讨论】:

【参考方案1】:
class MyObserver implements Observer<any> 
  constructor(
    private before,
    private after) 
  

  next = (value: any) => 
    this.before(value)
    this.after(value)
  ;
  error = (err: any) => ;
  complete = () => ;


const before = value => 
  console.log('before', value)

const after = value => 
  console.log('after', value)


const observer = new MyObserver(this.before, this.after);

const stream = of(1, 2, 3)
const subscribe = stream.subscribe(this.observer);

【讨论】:

你能在打字稿中使用类回答这个问题吗? 已编辑。这就是你要找的东西? 谢谢@Julius Dzidzevičius,这就是我想要的。我通过使class Generic 对此进行了一些更改。

以上是关于使用 RxJS 在 TypeScript 中创建 BaseObserver的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular 2中创建RxJS主题?

如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?

使用 Typescript 在 Sequelize 模型中创建实例方法

如何使用 bit 在 javascript 项目中创建 typescript 组件?

在 TypeScript 中创建电子菜单?

如何在 JavaScript/TypeScript 中创建具有非唯一键的地图?