Установите тайм-аут внутри асинхронной функции с помощью try и catch, чтобы не ловить ошибку - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 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

...