Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как присвоить полю значение из асинхронной функции в конструкторе класса? [TypeScript]

dojo mafia3 Ученик (45), открыт 1 неделю назад
Доброе утро.
У меня есть такой класс
 export class User extends UserAbstract { 

constructor(public userId: number) {
super();
}

}
В другом файле есть собственно класс UserAbstract
 export abstract class UserAbstract {
abstract userId: number
userLogin: string
}
И функция в третьем файле
 export async function getUserLogin(userId: number) {
const res = ... // Получаю из базы его логин
return res.login
}
В классе User мне нужно присвоить полю userLogin результат асинхронной функции getUserLogin, но как это сделать, если конструкторы классов не позволяют использовать await?
Избавиться от асинхронности не вариант, а если делать через промисы, тогда при обращении
 this.userLogin 
В какой-нибудь функции
 async changePass(newPassword: T) {
...this.userLogin
}
будет возвращен Promise<>, а не сама строка логина
1 ответ
сигнатурный Знаток (338) 1 неделю назад
Вы правы, конструктор класса не может быть асинхронным, и непосредственно использовать await в конструкторе нельзя. Однако, вы можете использовать другие методы для достижения вашей цели. Вам нужно получить логин пользователя асинхронно и затем присвоить его полю userLogin. Можно сделать это, например, с помощью асинхронного метода в классе User, который будет вызываться после создания экземпляра класса. Вот пример, как это можно сделать:

typescript
export class User extends UserAbstract {
userLogin: string // добавляем поле userLogin

constructor(public userId: number) {
super();
}

async initializeUserLogin() {
this.userLogin = await getUserLogin(this.userId); // вызов асинхронной функции и присвоение userLogin
}
}


Теперь при создании объекта User инициализация его логина может быть выполнена асинхронно, например:

typescript
const user = new User(123); // создание объекта

user.initializeUserLogin().then(() => {
console.log(user.userLogin); // здесь userLogin уже будет доступен
});


Таким образом, вы можете использовать асинхронный метод initializeUserLogin для установки userLogin после того, как объект User был создан.
dojo mafia3Ученик (45) 1 неделю назад
Спасибо!
Похожие вопросы