Что я пытаюсь сделать, так это заставить метод 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'));
Я могу придумать два решения
this.collection.create() синхронноisCollectionReady и сделайте небольшой цикл в методе save, который ждет, пока значение isCollectionReady не изменится на true.Есть ли лучший способ сделать это?



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


Определенно не используйте цикл; 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));
}
}
Я удалил свой аналогичный ответ, этот намного чище
Вам нужно много читать об асинхронных операциях в Javascript, управляемой событиями однопоточной природе node.js, обещаниях и, возможно, использовании
asyncиawait. В Javascript вы на самом деле не «ждете завершения функции». Вместо этого вы используете обещание или обратный вызов, чтобы получить уведомление, когда это будет выполнено.