Угловой 5+ ждать службы, которая возвращает обещание - PullRequest
0 голосов
/ 11 марта 2019

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

Итак, я попытался использовать метод ниже, но я столкнулся с проблемой синхронизации (код выполняется до завершения вызова)

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

  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;
  }

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Я рекомендую в 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;
       });
    );

  }

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

     this.compileData().subscribe(compiledData => {
         // do something with the compiled data
     });

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

0 голосов
/ 11 марта 2019

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

Сначала выполните getSomeData async, что также требует, чтобы оно вернуло обещание:

  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 голосов
/ 11 марта 2019
  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;
    });
  }
...