Подождите, пока функция завершится, прежде чем продолжить в javascript

Что я пытаюсь сделать, так это заставить метод save ждать this.collection.create() перед выполнением сохранения, потому что в противном случае может произойти сбой.

class UserRepository extends BaseRepository<User>
{
    constructor()
    {
        super();

        this.collection = this.db.collection('users');
        this.collection.create().then(res => {
            if (res.code === 200)
            {
                // collection successfully created
            }
        }).catch(err => {
            if (err.code === 409)
            {
                // collection already exists
            }
        });
    }
}

class BaseRepository<T>
{
  protected db: Database = Container.get('db');
  protected collection: DocumentCollection;

  public save(model: T): void
  {
    this.collection.save(model);
  }
}

И тогда я могу использовать это так:

const userRepository = new UserRepository();
userRepository.save(new User('username', 'password'));

Я могу придумать два решения

  1. Запускаем this.collection.create() синхронно
  2. Создайте свойство с именем isCollectionReady и сделайте небольшой цикл в методе save, который ждет, пока значение isCollectionReady не изменится на true.

Есть ли лучший способ сделать это?

Вам нужно много читать об асинхронных операциях в Javascript, управляемой событиями однопоточной природе node.js, обещаниях и, возможно, использовании async и await. В Javascript вы на самом деле не «ждете завершения функции». Вместо этого вы используете обещание или обратный вызов, чтобы получить уведомление, когда это будет выполнено.

jfriend00 21.04.2018 00:20
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
4 970
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Определенно не используйте цикл; JavaScript является однопоточным, и событие async никогда не завершится.

Вместо этого вы можете сохранить Promise для инициализации и просто связать его:

class UserRepository extends BaseRepository<User>
{
    constructor()
    {
        super();

        this.collection = this.db.collection('users');
        this._initPromise = this.collection.create().then(res => {
            if (res.code === 200)
            {
                // collection successfully created
            }
        }).catch(err => {
            if (err.code === 409)
            {
                // collection already exists
            }
        });
    }

    ensureInitialized() {
        return this._initPromise;
    }
}

class BaseRepository<T>
{
  protected db: Database = Container.get('db');
  protected collection: DocumentCollection;

  public ensureInitialized() {
    return Promise.resolve();
  }

  public save(model: T): Promise<void>
  {
    return this.ensureInitialized()
      .then(() => this.collection.save(model));
  }
}

Я удалил свой аналогичный ответ, этот намного чище

Wyatt Arent 20.04.2018 23:58

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