Работа с httpclient, который доводит следующий запрос до конца - PullRequest
1 голос
/ 10 июня 2019

При вызове с Sharepoint API огромный список, который превышает 100 строк или те, которые вы положили в $ top = 100.Вы получаете поля списка и переменную __next.Эта переменная __next содержит строку с адресом следующей страницы, который необходимо запросить для последующих элементов списка.

Моя проблема заключается в неспособности выполнить запрос http.get синхронно, поэтому нет способа узнать,следующее закончилось или нет.

Я пробовал рекурсивные методы, создаю свой собственный пользовательский оператор RxJS и создаю Observable, который вызывает subscriber.next bu. Я всегда сталкиваюсь с последующими запросами.

getExpedienteFromUrl(httpUrl?: string): Observable<ExpedienteListAndNextQuery> {
    const urlAddress = (httpUrl ? httpUrl : this.urlSharepointAPIExpedientes );
    return this.http.get<D>(urlAddress, {
      headers: {
        accept: 'application/json;odata=verbose'
      }
    }).pipe(
      map(x => this.mapExpedientesOfObserver(x) ),
      this.getExpedientesPipe()
    );
}

getExpedientesPipe(): Observable <IExpediente[]> {
    return ($source: Observable<ExpedienteListAndNextQuery>) => {
      return new Observable<IExpediente[]>(subscriber => {
        $source.subscribe(
          data => {
            const expedientes: IExpediente[] = data.Expedientes;
            const next: string = data.Next;
            subscriber.next(expedientes);
            if (next) {
              // call to this.getExpedienteFromUrl(next) [Async]
              // so if this where in a do while the following next will always 
              // be undefined
            }
          },
          err => subscriber.error(err),
          () => subscriber.complete()
        );
      });
    };
  }

1 Ответ

0 голосов
/ 11 июня 2019

Спасибо, @ user2457680.

Я опубликую, как мой код оказался для моего вопроса.Надеюсь, кто-то еще найдет это полезным.

getExpediente(): Observable<IExpediente> {
    return this.http.get<D>(this.urlSharepointAPIExpedientes, {
      headers: {
        accept: 'application/json;odata=verbose'
      }
    }).pipe(
      map(x => this.mapExpedientesOfObserver(x) ),
      expand(x => (x.Next ? this.getExpedienteFromUrl(x.Next) : EMPTY)),
      concatMap(x => x.Expedientes)
    );
  }

  private getExpedienteFromUrl(httpUrl: string): Observable<ExpedienteListAndNextQuery> {
    return this.http.get<D>(httpUrl, {
      headers: {
        accept: 'application/json;odata=verbose'
      }
    }).pipe(
      map(x => this.mapExpedientesOfObserver(x))
    );
  }

export interface D {
  d: Results;
}

export interface Results {
  results: SharepointExpediente[];
  __next: string;
}

Функция карты превращает переменные SharePoint только в человеческие переменные после того, как всем SharePoint нравится использовать word_x020_word_x020_word, поддержание которого для меня или для других было бы кошмаром.

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