В сервисе Angular правильно ли предполагать, что функция карты гарантированно будет синхронной, если она используется внутри Observable? - PullRequest
0 голосов
/ 30 апреля 2018

В приложении Angular у меня есть компонент, который подписывается на Observable в сервисе.

this.listService.listApi(params)
          .subscribe(
            response => this.listServiceResponse(response),
            error => this.serviceError = <any>error);

В сервисе наблюдаемое делает http-запрос. Мне нужно перебрать ответ и построить массив результатов на основе некоторых вычислений, которые в конечном итоге будут возвращены компоненту.

Для ясности я упростил результирующий массив здесь, так как мой намного сложнее, но суть в том, что я достиг этого, используя функцию карты. Вот соответствующие части методов в сервисе:

listApi(params:any) Observable<any[]> {
    ...
    return this.http.get(params.url, ampOptions)
                        .map(data => this.listExtract(response, params))
                        .catch(this.handleError);
}
listExtract(response:any, params:any) {

  let successArray:any = [];
  let failedArray:any = [];

  let filteredArray:any = [];

  let itemFound:boolean = false;

  response.map((item, index) => {
    if(item.rank > params.rank) {
      filteredArray.push(item);
      if(item.id === params.id) {
        itemFound = true;
      }
    }
  });

  // are the following lines guaranteed to wait for the map function to finish?

  if(itemFound === true) {

    // do some additional calculations and construct the successArray
    // then push the filteredArray onto my successArray;

    successArray.push(filteredArray);

    return successArray;

  } else {

    // do some additional calculations and construct the failedArray
    // then push the filteredArray onto my failedArray;

    failedArray.push({flag:'failed',id:params.id});
    failedArray.push(filteredArray);

    return failedArray;
  }

}

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

1 Ответ

0 голосов
/ 30 апреля 2018

Если response гарантированно является массивом - чтобы не взорвать ваш код - тогда да, его функция map () является синхронной .

...