Асинхронные методы Vuex игнорируют возвращаемое значение разрешения - PullRequest
0 голосов
/ 31 августа 2018

Итак, я переписываю свой первый проект vuejs для nuxtjs и переписываю все свои вызовы API для действий хранилища, когда я заметил, что не могу возвращать значения из них, если я не отклоняю их.

Независимо от того, как я пытаюсь вернуть значение, return x или return Promise.resolve(x) результат моего обещания всегда неопределен

Я попробовал следующее простое действие:

async uselessWait(){
  setTimeout(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

и при вызове его результат всегда равен undefined, хотя обещание разрешается нормально

Это преднамеренно, это ошибка или это только у меня?

1 Ответ

0 голосов
/ 31 августа 2018

Это немедленно вернет решенное значение Promise.

В идеале

async uselessWait(){
  return setTimeout(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

Но setTimeout не возвращает обещание, поэтому вы не можете этого сделать.

Здесь 'взять setTimeout, который делает.

setTimeoutPromise = (fn, delay) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        const ret = fn()
        resolve(ret)
      } catch (e) {
        reject(e)
      }
    }, delay)
  })
}

setTimeoutPromise(() => {
  console.log('ok')
}, 1000)

Итак, для вашего примера.

async uselessWait(){
  return setTimeoutPromise(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}

Теперь асинхронная функция возвращает обещание, которое разрешается (или отклоняется, если ваш обратный вызов сгенерирован)

Вы могли бы также ждать вместо возвращения.

async uselessWait(){
  await setTimeoutPromise(() => {
    return ("success"); // and return Promise.resolve("success");
  }, 1000)
}
...