bindCallback испускают только один раз - PullRequest
0 голосов
/ 21 апреля 2020

В Angular с использованием RX JS имеется следующий код в классе:

static on = (event: string, callback: (e: any) => void) => {
    switch (event) {
        case EVENTS.CONNECT.ALIAS:
            return emitter.subscribe(EVENTS.CONNECT.ALIAS, callback);
        case EVENTS.DISCONNECT.ALIAS:
            return emitter.subscribe(EVENTS.DISCONNECT.ALIAS, callback);
        case EVENTS.BUTTON_PRESS.ALIAS:
            return emitter.subscribe(EVENTS.BUTTON_PRESS.ALIAS, callback);
        case EVENTS.AXIS_MOVEMENT.ALIAS:
            return emitter.subscribe(EVENTS.AXIS_MOVEMENT.ALIAS, callback);
    }
}

, который в основном добавляет обратный вызов в список обратных вызовов для указанного eventListener. (проблема не здесь)

В моем приложении Angular у меня есть следующий код в службе:

  addListener(eventName: string): Observable<GamepadEvent> {
    return bindCallback<string, GamepadEvent>(JoypadService.on)(eventName);
  }

И в компоненте, который я делаю:

  ngOnInit() {
    this.gamepadService.addListener(EVENTS.AXIS_MOVEMENT.ALIAS).subscribe(res => {
      console.log(res);
    });
  }

Проблема, с которой я сталкиваюсь, заключается в том, что подписка на наблюдаемое срабатывает только один раз, но если я добавлю следующую строку и не буду использовать bindCallback:

 addListener(eventName: string): Observable<GamepadEvent> {
    JoypadService.on(eventName, (e) => console.log(e))
    return bindCallback<string, GamepadEvent>(JoypadService.on)(eventName).pipe(
      takeUntil(this.unsubscribe)
    );
  }

this JoypadService.on (eventName, (e) => console.log (e)) `будет запускать все время, когда происходит изменение (как и должно быть).

Очевидно, bindCallback срабатывает только один раз, но можно ли его запускать бесконечно, пока отписаться?

1 Ответ

1 голос
/ 21 апреля 2020

Из документации rx js bindCallback

Обратите внимание, что Observable, созданный функцией вывода, всегда выдаст одно значение и затем сразу завершится.

В последней версии вашего кода вы в конечном итоге создаете новый Observable каждый раз, когда звоните addListener(eventName: string). Любая из этих Observable'ов будет излучаться только один раз.

Если вы хотите создать Observable, который будет многократно уведомлять, пока он не будет отписан, вам, вероятно, стоит заглянуть в конструктор Observable.

In в вашем случае код может выглядеть следующим образом:

createMyObs = (event: string): Observable<any> => {
    return new Observable(
        (observer: Observer<any>): TeardownLogic => {
            JoypadService.on(event, (e: any) => {
               observer.next(e)
            }
            // you can return here a function called upon unsubscription to
            // do any cleanup (i.e. the teardown logic)
        },
    );
};

Таким образом, вы создаете один Observable, представляющий поток событий.

...