У меня есть Ionic 3 App , где я использую асинхронно и ожидаю функций ES6 для синтаксического сахара обещаний . Я знаю, что это всего лишь базовый вопрос или потому что я новичок в использовании функции async и await .
Теперь проблема в том, что у меня setTimeout
внутри моей асинхронной функции signI
n метода для аутентификации пользователя.
Это мой код ниже:
async signIn() {
try {
this.loader = true // Present a loader
this.backgroundLoader = this.loadingCtrl.create({ content: 'Signing you in...' });
this.backgroundLoader.present();
// Response from server
const response: any = await this.authService.loginDriver(this.loginForm.value)
console.log(response)
if (response.status == 200) { // If success response
const token = await this.storage.set('token', response.data.token)
console.log('token:', token)
this.events.publish('driver:authenticated') // Broadcast an event that the driver has authenticated
setTimeout(async () => { // Dismiss the loader after successfull authentication
try {
const meDetails = await this.driverMe.getDriverMeInfo() // Get the profile information of the driver if
console.log(meDetails)
} catch (err) { console.log(err) }
this.backgroundLoader.dismiss();
this.loader = false
this.navCtrl.setRoot("HomePage")
this.menu.swipeEnable(true);
}, 1500);
}
} catch(err) { // If something goes wrong or an error occured
console.log(err)
this.backgroundLoader.dismiss();
this.loader = false
err.status == 401 || 422 // Something wrong in your authentication credentials
? this.alertMessage.alertMessage('Incorrect email or password', null)
: this.alertMessage.alertMessage('Something went wrong.', 'Please try again.') // Other errors not related to the data entry to be authenticated
}
}
Функция выполняет базовую аутентификацию , чтобы отправить запрос на публикацию на API-сервер и получить токен ответа и поместить его в Хранилище и используйте этот токен для каждого запроса, которому требуется промежуточное ПО аутентификации в бэкэнде .
На самом деле в моем коде нет ошибки , она прекрасно работает. Но если вы посмотрите на try and catch
внутри метода setTimeout
. Это выглядит некрасиво. Цель try and catch
состоит в том, чтобы отлавливать ошибку для каждого обещания , но я снова делаю его заново в функции setTimeout
.
Я не уверен, но думаю, что это происходит из-за того, что функция обратного вызова на setTimeout
является новой async and await
, поэтому она не перехватит ошибку снаружи.
Так что мой вопрос действительно есть способ справиться с этим? Чтобы избежать переопределения try and catch
внутри метода setTimeout .
Цените, если кто-то может помочь.
Заранее спасибо.
Есть ли в любом случае справиться с этим, используя один try and catch