Как внедрить Promise в async / await? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующий async/await метод:

async todo() {
    const res = await axios.get('/todo')
}

getTodo() {
    this.todo()
}

Теперь, в async/await, как вы узнаете, что запрос выполнен (200)?В Promises мы просто используем then:

// store/todo.js
todo() {
    const res = axios({
        method: 'GET',
        url: '/todo'
    })
    return res
}

// components/Todo.vue
getTodo() {
    this.todo().then(res => {
        console.log('Request Executed Successfully!')
    })
}

Это прекрасно работает, но когда я пытаюсь добавить async/await в getTodo и выполнить что-то вроде этого:

async todo() {
    try {
      const res = await axios.get('/todo')
      return res
    } catch(e) {
      console.log(e)
    }
}

async getTodo() {
  try {
    await this.todo()
    console.log('Request Completed')
  } catch(e) {
    console.log(e)
  }
}

Демо:https://jsfiddle.net/jfn483ae/

Это просто не работает.Журнал выполняется до того, как запрос будет завершен, то есть после возникновения какой-либо ошибки.Пожалуйста, помогите.

1 Ответ

2 голосов
/ 08 марта 2019

Журнал запускается […] после некоторой ошибки.

Да, в вашем новом todo методе вы catch выдает ошибку и затем возвращаете undefined какнормальный результат.Просто не используйте try / catch, когда вы не можете обработать ошибку, используйте тот же код, что и в оригинальном, и обещание будет работать так же, когда вы await it:

todo() {
  return axios({
    method: 'GET',
    url: '/todo'
  })
}
async getTodo() {
  try {
    await this.todo()
    console.log('Request Completed')
  } catch(e) {
    console.log(e)
  }
}
...