Допустим, в машинописном тексте у меня есть следующие два класса:
class X {
constructor() {
}
public async doSomething(): Promise<string> {
console.info('x')
return 'x'
}
}
class Y extends X {
constructor() {
super()
}
public override async doSomething(): Promise<string> {
console.info('y before')
await super.doSomething()
console.info('y after')
return 'y'
}
}
а затем я запускаю следующее:
const y = new Y()
y.doSomething()
Я ожидаю, что результат будет:
y before
x
y after
но вместо этого:
y before
x
как будто await super.doSomething() ничего не ждет. Я возился с этим и обнаружил, что если я добавлю некоторый код после y.doSomething(), обещание в конечном итоге разрешится и напечатается y after, что еще больше подтвердит мою теорию о том, что оно не ожидает должным образом.
Что тут происходит?
Лучше было бы написать обещание как public async doSomething(): Promise<string> { return new Promise(resolve => { console.info('x') resolve('x'); }); }
@epascarello, как лучше? Почему вы отмечаете функцию как асинхронную, если не используете await?
потому что это лучший пример проверки обещания....
Это абсолютно то же самое, но ваше менее читабельно.
ОП на самом деле не является асинхронной операцией. лол Можешь переписать это как ожидание
Итак, знаменитый вопрос @goastler: каков настоящий код?
Пожалуйста, смотрите комментарии к ответу @Konrad.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Кажется, работает нормально
class X {
constructor() {}
async doSomething() {
console.info('x')
return 'x'
}
}
class Y extends X {
constructor() {
super()
}
async doSomething() {
console.info('y before')
await super.doSomething()
console.info('y after')
return 'y'
}
}
const y = new Y
y.doSomething()Исходный doSomething, вероятно, выдает ошибку, поэтому 'y after' не выводит
class X {
constructor() {}
async doSomething() {
console.info('x')
throw 'e'
return 'x'
}
}
class Y extends X {
constructor() {
super()
}
async doSomething() {
console.info('y before')
await super.doSomething()
console.info('y after')
return 'y'
}
}
const y = new Y
y.doSomething()Как указано в комментариях, мой код представляет собой игрушечный пример, демонстрирующий проблему. В конце моего кода стоял process.exit(0), что оказалось частью проблемы. Я пропустил await в другом месте моего кода, что означало, что обещание не ожидалось до завершения, и nodejs доходил до строки process.exit(0) до завершения обещания. Добавление недостающего await все решило. Итак, ответ @Konrad правильный, он работает, но всем, у кого есть эта проблема, нужно поискать недостающие await!
Я получаю ожидаемый результат jsfiddle.net/epascarello/80ov2ec9