Как вернуть значение, разрешенное из обещания в функции?

#javascript #angular #typescript #async-await #es6-promise

Вопрос:

Файл1.ts: Я вызываю приведенный ниже метод службы file2 и ожидаю ответа.

 const output = await this.file2Service.getMainData();
 

Файл2.ts:
Я ожидаю возвращаемое значение(источник данных) из приведенного ниже метода. Но здесь происходит следующее: «Приведенная ниже функция возвращает источник данных еще до того, как будет выполнен код в блоке .then ()».

Так что я каждый раз становлюсь неопределенным. Что нужно сделать, чтобы получить фактическое значение источника данных.

 public async getMainData(): Promise<any> {
    const data = await this.getSubData();
  data.forEach((result) => {
    result.then((finalResult) => {
            if (finalResult === 'success') {
            const dataSource = await this.callDataSource();
        }
    });
  });
  return dataSource;

}
 

Пожалуйста, не обращайте внимания на синтаксические ошибки в приведенном выше фрагменте, это просто пример, а не фактический код.

Комментарии:

1. Две проблемы, первая из которых заключается в смешении async / await с методами обещания .then , выберите один шаблон и придерживайтесь его. Во-вторых, что вы ожидаете вернуть? Из текущей попытки похоже, что вы хотите вернуть последний успешный результат, но есть множество результатов, это то, что вы намереваетесь?

2. @Matthew да, я пытаюсь вернуть значение, присутствующее внутри блока if ().

3. this.getSubData() возвращает ли массив обещаний? другая проблема заключается dataSource в том, что ее не существует в самой внешней области getMainData . Нужна лучшая картина проблемы. Спасибо!

Ответ №1:

Вам не нужно вызывать .then , если вы уже ожидаете метод.

 public async getMainData(): Promise<any> {
  const data = await this.getSubData();

  for (const result of data) {
    // from your code sample it's unclear 
    // whether getSubData returns a collection of 
    // values or a collection of promises-of-values, 
    // remove the await if you're simply returning values
    
    const finalResult = await resu<

    if (finalResult === 'success') {
      return await this.callDataSource();
    }
  }

  throw new Error('could not find a successful result.');
}