RXJS: Как сбросить значения массива BehaviorSubject - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть этот Behaviorsubject:

_list: BehaviorSubject<BehaviorSubject<object>[]>; 
 list: Observable<Observable<object>[]>;
//That I create like this in the constructor: 
 this._list= new BehaviorSubject<BehaviorSubject<object>[]>([]);
 this.list= this._messages.asObservable();

Теперь в какой-то момент я хочу сбросить _list без отключения подписчиков.Моя первая попытка была:

this._list.next([]); 

Но этот подход приводит к этой ошибке:

Error: You provided 'undefined' where a stream was expected. 
You can provide an Observable, Promise, Array, or Iterable.

Другой подход состоял в том, чтобы вызвать это снова:

this._list= new BehaviorSubject<BehaviorSubject<object>[]>([]);
this.list= this._messages.asObservable();

Бат этот подходотключает каждого подписчика.

Как дать списку пустой массив BehaviorSubject?

РЕДАКТИРОВАТЬ

Полный стек ошибок согласно запросу:

Error: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (http://localhost:4200/vendor.js:236751:15)
    at subscribeToResult (http://localhost:4200/vendor.js:236890:76)
    at MergeMapSubscriber._innerSub (http://localhost:4200/vendor.js:232103:90)
    at MergeMapSubscriber._tryNext (http://localhost:4200/vendor.js:232097:14)
    at MergeMapSubscriber._next (http://localhost:4200/vendor.js:232080:18)
    at MergeMapSubscriber.next (http://localhost:4200/vendor.js:227382:18)
    at BehaviorSubject.next (http://localhost:4200/vendor.js:227168:25)
    at BehaviorSubject.next (http://localhost:4200/vendor.js:226649:15)
    at MsgControllerService.renewMessages (http://localhost:4200/main.js:3279:24)
    at http://localhost:4200/main.js:2880:40
(anonymous) @ chat-manager.service.ts:55
invoke @ zone-evergreen.js:359
onInvoke @ core.js:39698
invoke @ zone-evergreen.js:358
run @ zone-evergreen.js:124
(anonymous) @ zone-evergreen.js:855
invokeTask @ zone-evergreen.js:391
onInvokeTask @ core.js:39679
invokeTask @ zone-evergreen.js:390
runTask @ zone-evergreen.js:168
drainMicroTaskQueue @ zone-evergreen.js:559
invokeTask @ zone-evergreen.js:469
invokeTask @ zone-evergreen.js:1603
globalZoneAwareCallback @ zone-evergreen.js:1629

Соответствующий код для ошибки:

addMessages(messages: object[]): void {
    if (messages.length > 0) {
      let newMessages = messages.map(message => {
        message['visualisationState'] = MsgControllerService.initVisualisationState();
        message['visualisationState'].strongLabels = MsgControllerService.getTopLabels(message, this.numberOfTopLabels);
        return new BehaviorSubject<object>(message);
      });
      this.addMessageToMessages(newMessages);
    }
  }

  renewMessages(messages: object[]) {
    this._messages.next([]);
    this.addMessages(messages);
  }
  addMessageToMessages(newMessage: BehaviorSubject<object>[]) {
    this._messages.next(this._messages.getValue().concat(newMessage)); // Error thrown here
  }

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Почему вы создаете BehaviorSubject внутри BehaviorSubject?Просто сделайте это:

    _list: BehaviorSubject<any[]>; 
    list: Observable<any[]>;
    //That I create like this in the constructor: 
    this._list= new BehaviorSubject<any[]>([]);
    this.list= this._messages.asObservable();
0 голосов
/ 20 сентября 2019

Я обнаружил, что любая труба () в списке (сообщения, если вы прочитали подробности ошибки) всегда будет выполняться, даже в условных выражениях.В моем коде был такой метод:

if (index < this.msgController.getLengthOfMessages()) {
      return this.msgController.messages.pipe(mergeMap(messages => {
        let message = messages.reverse()[index];
        messages.reverse();
        return message;
      }));
    } else {
      return null;
    }

Это означает, что даже если я проверил, что сообщения / список имеют значения, .pipe () все равно будет выполняться с пустым массивом.Простым решением этой проблемы было бы гарантировать возвращение действительной Observable, которую я сделал следующим образом:

if(!message) return messages; 

, так как метод не возвращает результат конвейера, это не представляет проблемы в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...