Действие магазина Vuex из Promise в асинхронное / ожидание - PullRequest
0 голосов
/ 19 июня 2019

В настоящее время я использую promises в действиях магазина, но хочу преобразовать его в async/await. Это пример действия магазина с обещаниями:

fetchActiveWorkspace (context, workspaceID) {
    if (workspaceID) {
      return this.$axios.get(`@api-v01/workspaces/workspace/${workspaceID}`)
        .then(response => {
          context.commit('setActiveWorkspace', response.data)
        })
        .catch(err => {
          throw err
        })
    } else {
      return Promise.resolve(true)
    }
  },

Это действие fetchActiveWorkspace разрешено в компонентах, поскольку оно возвращает promise. Как я могу преобразовать этот фрагмент кода в структуру async/await и использовать его в компонентах?

1 Ответ

0 голосов
/ 21 июня 2019

Вот как бы я попытался перевести это;принять во внимание, что, поскольку у меня нет доступа к исходному коду в полном контексте, я не могу попробовать его из первых рук, чтобы убедиться, что он работает;но, тем не менее, это то, как вы можете использовать async/await с обещаниями.

// 1. Mark the function as `async` (otherwise you cannot use `await` inside of it)
async fetchActiveWorkspace(context, workspaceID) {
    if (workspaceID) {

      // 2. Call the promise-returning function with `await` to wait for result before moving on.
      // Capture the response in a varible (it used to go as argument for `then`)
      let response = await this.$axios.get(`@api-v01/workspaces/workspace/${workspaceID}`);
      context.commit('setActiveWorkspace', response.data);
    }

    // 3. I don't think this is necessary, as actions are not meant to return values and instead should be for asynchronous mutations.
    else {
      return true;
    }
}

Вы можете окружить тело функции try/catch в случае, если вы хотите захватывать и обрабатывать исключения.Я добавил его не для того, чтобы все было просто, и потому что ваш код, основанный на обещаниях, просто захватит и повторно сгенерирует исключение, ничего не делая.

...