Наблюдение за рекурсивным списком или крошкой - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть рекурсивная асинхронная функция, которая создает крошку или путь к форуму, но я не понимаю, как наблюдать за самой крошкой?Вот как можно сделать так, чтобы все форумы, из которых состоит крошка, можно было наблюдать, и если кто-то из них изменится, вся крошка будет снова подписана.Это происходит в том случае, если один из родительских идентификаторов изменяется, когда пользователи удаляют форумы, тем самым разрывая ссылку.Мне нужна горячая наблюдаемая?

Я подумал, что мне нужно изменить ее на этом этапе:

const parentForum = await that.forumsAllService.getForumFromPromise (forumId);

чтобы я наблюдал за этим, но как наблюдать за всеми форумами как за одним наблюдателем?

const parentForum = await that.forumsAllService.getForumFromObservable (forumId);

Какие части моего кода у меня естьизменить?

// routine to fetch the parent forums that make up the breadcrumb to the child.
private getBreadcrumbs (parentForumId): Promise<any[]> {
    return new Promise<any[]>((resolve, reject) => {
      const that = this;

      let breadcrumbs: any[] = [];

      // fetch parent forum
      const getBreadcrumbFragment = async function (forumId) {
        const parentForum = await that.forumsAllService.getForumFromPromise(forumId);

        if (parentForum){
          // store forum and check if it has a parent of its own, store its id as the nextPage
          return {
            data: parentForum,
            nextPage: parentForum && parentForum.parentId && parentForum.parentId.length > 0 ? parentForum.parentId : undefined
          };
        }
        else {
          return {
            data: null,
            nextPage: undefined
          };
        }
      };

      // recursive routine to build breadcrumb
      const getBreadcrumb = async function (forumId) {
        const fragment = await getBreadcrumbFragment(forumId)

        // store our crumbs
        if (fragment && fragment.data)
          breadcrumbs.push(fragment.data);

        if (fragment.nextPage) { // we still have another parent child relationship to fetch
          return await getBreadcrumb(fragment.nextPage);
        } else {
          return breadcrumbs.reverse(); // finish, put list the right way around
        }
      }

      // initialize breadcrumb
      getBreadcrumb(parentForumId);

      // return our results
      resolve(breadcrumbs);
    });
}

// *****************************************************
// this is how i eventually call the recursive function
// *****************************************************
if (forum.parentId && forum.parentId.length > 0){
    console.log('fetching breadcrumbs');
    this._breadcrumbSubscription = Observable.fromPromise(this.getBreadcrumbs(forum.parentId))
        .subscribe(breadcrumbs => {
        this.breadcrumbs = of(breadcrumbs);
    });
}
else {
    console.log('not fetching breadcrumbs');
    this.breadcrumbs = of([]);
}
...