Как дождаться асинхронной суперфункции в javascript/typescript?

Допустим, в машинописном тексте у меня есть следующие два класса:

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, что еще больше подтвердит мою теорию о том, что оно не ожидает должным образом.

Что тут происходит?

Я получаю ожидаемый результат jsfiddle.net/epascarello/80ov2ec9

epascarello 10.10.2023 18:49

Лучше было бы написать обещание как public async doSomething(): Promise<string> { return new Promise(resolve => { console.info('x') resolve('x'); }); }

epascarello 10.10.2023 18:51

@epascarello, как лучше? Почему вы отмечаете функцию как асинхронную, если не используете await?

Konrad 10.10.2023 18:52

потому что это лучший пример проверки обещания....

epascarello 10.10.2023 18:53

Это абсолютно то же самое, но ваше менее читабельно.

Konrad 10.10.2023 18:53

ОП на самом деле не является асинхронной операцией. лол Можешь переписать это как ожидание

epascarello 10.10.2023 18:54

Итак, знаменитый вопрос @goastler: каков настоящий код?

epascarello 10.10.2023 18:56

Пожалуйста, смотрите комментарии к ответу @Konrad.

goastler 10.10.2023 20:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, работает нормально

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!

goastler 10.10.2023 20:39

Другие вопросы по теме