Угловой 5+ ждать службы, которая возвращает обещание

#!/bin/bash -e

должно быть достаточно.

0
задан rayray 11 March 2019 в 14:35
поделиться

3 ответа

Я рекомендую в Angular стараться держать вещи как наблюдаемые. Приятно быть последовательным, вместо того, чтобы переключаться между наблюдениями и обещаниями.

Мне не очень понятно, возвращает ли myService.something () обещание или наблюдаемое. Если наблюдаемые:

  private getSomeData(): Observable<<DataObjectArray[]> {
    return this.myService.something().pipe(
       map(response => response.children)
    );
  }

, если обещание очень похоже, но:

    private getSomeData(): Observable<<DataObjectArray[]> {
      return fromPromise(this.myService.something()).pipe(
       map(response => response.children)
      );
    }

Тогда:

  public compileData(): Observable<DifferentDataArray[]> {

   // get some stuff from a config, then make service call
    return this.getSomeData().pipe(
       map(someData => {
           /* If I have a promise returned, someData errors saying not an array type */
           var dataCollection = [];
           for (let oneData of someData){
            /* loop through config data + service data making a return object array */
                 // should dataCollection.push(changedData);
            }
            return dataCollection;
       });
    );

  }

Наконец потреблять где-то еще:

[ 113]

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

0
ответ дан bgraham 11 March 2019 в 14:35
поделиться
  private getSomeData(): DataObjectArray[] {
    return this.myService.something().map((response: Response) => {
      return response.children;
    });
  }

Должно быть

  private getSomeData(): Promise<DataObjectArray[]> {
    return this.myService.something().map((response: Response) => {
      return response.children;
    });
  }
0
ответ дан trichetriche 11 March 2019 в 14:35
поделиться

Вы можете использовать новые ключевые слова Javascript async и await

Сначала сделайте getSomeData асинхронным, что также требует от него возврата обещания:

  private async getSomeData(): Promise<DataObjectArray[]> {
    return this.myService.something().map((response: Response) => {
      return response.children;
    });
  }

, затем ожидайте функция в compileData:

let someData = await this.getSomeData();

Однако это означает, что compileData, поскольку он возвращает результат, должен быть также асинхронным. Это означает, что вам нужно добавить ключевое слово async и изменить тип на Promise<DifferentDataArray[]>.

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

Ваша полная функция compileData:

 public async compileData(): Promise<DifferentDataArray[]> {

   // get some stuff from a config, then make service call
    let someData = await this.getSomeData();

    /* If I have a promise returned, someData errors saying not an array type */
    for (let oneData of someData){
      /* loop through config data + service data making a return object array */
   }
    return this.dataCollection;
  }


  public compileData(): DifferentDataArray[] {

   // get some stuff from a config, then make service call
    let someData = this.getSomeData();

    /* If I have a promise returned, someData errors saying not an array type */
    for (let oneData of someData){
      /* loop through config data + service data making a return object array */
   }
    return this.dataCollection;
  }
0
ответ дан Stefan 11 March 2019 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: