Подписка не инициируется на объекте Observable.create - PullRequest
0 голосов
/ 05 июня 2018

Итак, у меня есть следующее:

const getAllData = Observable.create( () => {
    console.log(Date.now() + ' - Calling getallcontenttypes');
    this.getAllContentTypes();
    console.log(Date.now() + ' - Calling getalltaxonomysitecolumns');
    this.getAllTaxonomySiteColumns();
  });
  getAllData.subscribe( () => {
    console.log(Date.now() + ' - Subscribed, data loaded, calling router...');
    this.router.navigateByUrl('/contenttype');
  });  

Функции внутри моего const getAllData работают, получают данные и обрабатывают их (с дополнительными журналами консоли, поэтому я знаю, что есть значения, и они выполняются через эти функции).

Что я хочу сделать сейчас, когда все мои функции (на данный момент 2) в моем getAllData завершат получение и обработку всех данных, я хочу перенаправить в другое представление.Эти 2 функции (getall ...) теперь возвращают void.Это все внутри моего ngOnInit ().

Но пока что кажется, что .subscribe () не срабатывает, или, может быть, я делаю это неправильно.Кто-нибудь может увидеть в чем проблема?

Например, вот функция getAllContentTypes:

public getAllContentTypes() {

const jsonStringified = JSON.stringify(json);

this.contentTypeService.getAllContentTypes(jsonStringified).pipe(
  operators.tap(res => this.convertJsonResultToArrayCT(res)))
  .subscribe(res2 => this.storeInSessionStorage(res2, 'ContentTypes'));
}  

public storeInSessionStorage(res: any, key: string) {
    sessionStorage.setItem(key, JSON.stringify(this.contentTypeArray));
    console.log(Date.now() + ' - Stored in sessionstorage: ' + key);
}  

А вот изображение того, что я получаю в своей консоли: https://imgur.com/a/xQhaqjv.

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

ОК. Итак, я изменил свои функции, чтобы они возвращали Observables:

public getAllContentTypes(): Observable<ContentType> {

const jsonStringified = JSON.stringify(json);

this.contentTypeService.getAllContentTypes(jsonStringified).pipe(
  operators.tap(res => this.convertJsonResultToArrayCT(res)))
  .subscribe(res2 => this.storeInSessionStorage(res2, 'ContentTypes'));

return from(this.contentTypeArray);

} ​​

Я также отредактировал свой код следующим образом:

const test = forkJoin(
    this.getAllContentTypes(),
    this.getAllTaxonomySiteColumns()
  ).subscribe( () => {
    console.log(Date.now() + ' - Subscribed, data loaded, calling router...');
    this.router.navigateByUrl('/contenttype');
  });  

Но подписка не сработала.

1 Ответ

0 голосов
/ 05 июня 2018

Когда вы создаете наблюдаемое с помощью метода create (), вам нужно передать наблюдателя в качестве аргумента, чтобы вы могли позже вызвать его (), error () или complete (), например,

const getAllData = Observable.create( observer => { 
                                     observer.next('123');
                                    });

Когда код подписывается на это наблюдаемое, он должен передать функцию для обработки выданного значения и, необязательно, ошибки и завершения, то есть наблюдателя, например,

getAllData.subscribe(value => console.log(value));  // prints 123

У меня есть пример рабочего кода:https://codepen.io/yfain/pen/xLaMdN?editors=1012

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