Прежде всего, вы должны заметить, что async / await функционирует, по сути, как еще один способ выражения рабочих процессов на основе Promise.Когда вы помечаете функцию как асинхронную, вы в основном говорите, что эта функция будет возвращать Promise, а когда вы используете await внутри асинхронной функции, вы в основном говорите, что остальная часть этой функции будет частью обратного вызова .then
.этого неявного обещания.
Возвращаясь к вашему вопросу, signIn()
помечается как асинхронный, что означает, что он возвращает обещание (именно поэтому signIn().then
не генерирует ошибку TypeError), и внутри него высоздание обещания (auth.signInWithEmailAndPassword
), но это обещание не связано с неявным обещанием signIn
, поэтому неявное обещание разрешается немедленно.Другими словами, ваша исходная версия signIn
эквивалентна:
signIn() {
auth.signInWithEmailAndPassword(this.email,this.password).then((cred) => {
console.log(cred);
return cred;
});
return Promise.resolve(undefined);
}
Чтобы исправить это поведение, вам необходимо удалить ключевое слово async
из signIn
и вернуть обещание из signIn
если вы хотите использовать .then
вне его.Например:
signIn() {
return auth.signInWithEmailAndPassword(this.email,this.password).then((cred) => {
console.log(cred);
return cred;
});
}
Приведенный выше код фактически эквивалентен этой асинхронной / ожидающей версии:
async signIn() {
const cred = await auth.signInWithEmailAndPassword(this.email,this.password);
console.log(cred);
return cred;
}
Обратите внимание, что в вашем прослушивателе событий вы не ожидаетеобещание, поэтому оно разрешится до выполнения обещания signIn
.То есть ваш оригинальный обработчик событий эквивалентен:
e => {
e.preventDefault();
const user = new User(loginForm.email.value,loginForm.password.value);
user.signIn().then(cred => {
console.log(cred);
loginForm.reset();
});
return Promise.resolve(undefined);
}
Это , вероятно ничего для вас не значит, так как события DOM либо не заботятся о возвращенииЗначение обратного вызова или уважения обещаний.Это различие может быть важным в некоторых сценариях (например, e.preventDefault()
не будет работать, если вы вызовете его внутри .then
/ после async
)