#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.');
}