Возможный необработанный отказ от обещания (id: 0): Ошибка: "getLoginData" только для чтения

Разрушение из реквизита не работает внутри асинхронной функции, хотя оно работает нормально, если я использую его с помощью this.props.

Это для реактивного приложения, уже запущенного в производство, которое внезапно начало выдавать эту ошибку 2 дня назад. Я пытался обновить Babel с помощью этого

Но пока безуспешно.

Если я использую this.props.getLoginData, он работает нормально

Если я использую следующую функцию, она ошибочна:

yo = async () => { // with async
  const { getLoginData } = this.props; // error
};

Пока работает следующая функция:

yo = () => { // without async
  const { getLoginData } = this.props;
  console.log(getLoginData); // works fine
};

Это также отлично работает:

yo = async () => { // with async
  console.log(this.props.getLoginData); // works fine
};

Я ожидаю, что оба сценария будут работать нормально.

Пожалуйста, клонируйте и запустите репо, чтобы воспроизвести эту ошибку.

Пожалуйста, найдите шаги для запуска информации о проекте и среде в README.md.

PS: вы найдете ошибку в консоли (нажмите ⌘⌥I)

Ответ 1

Похоже, что зависимость от babel является причиной проблемы в моем случае.

Когда я смотрю в свой package-lock.json и ищу plugin-transform-regenerator я вижу версию 7.4.5. Блокировка версии до 7.4.4 путем добавления ее в мой package.json позволяет мне создавать без проблем.

Эту проблему было бы легче отследить, если бы я не игнорировал свой package-lock.json.

В итоге,

npm я -E @babel/[email protected]

Ответ 2

Когда вы используете async, вы должны использовать ключевое слово await.

getLoginData = async () => {
  const { getLoginData } = this.props;
  console.log(getLoginData); // error
  await ... // async action, use promise or setTimeout ..
};

Ответ 3

Я столкнулся с той же проблемой.

Использование babel версии 7.4.4 мне не помогло, но я нашел другое решение, которое сработало - завершение деструктуры в блок try-catch.

Я до сих пор не знаю, почему возникает эта проблема - обновлю, когда я это сделаю.

________ОБНОВИТЬ_______

В конце концов, предложенное решение @makenova сработало (Спасибо, мужик!). Что мне нужно было сделать, это удалить все модули узла + пакет-блокировка, а затем запустить

npm i -E @babel/[email protected]

и после этого запуска

npm i

До этого я использовал пряжу, и это не помогло.

Ответ 4

Обновление:

Николо-Рибаудо решил проблему здесь: https://github.com/facebook/regenerator/pull/377


Альтернативное решение состоит в том, чтобы заставить regenerator-transform использовать ~0.13.0, как предложено Николо-Рибаудо.

Если вы используете пряжу, добавьте это в свой package.json:

  "resolutions": {
    "regenerator-transform": "~0.13.0"
  }

Если вы используете npm:

  1. Установите его как devDependency
  2. Удалить package-lock.json
  3. Переустановите зависимости

Ответ 5

У меня есть асинхронная функция, когда при деструктурировании и сохранении const показывается ошибка: возможный необработанный отказ от обещания (id: 0): ошибка: 'userOperations' только для чтения, это сработало для меня (изменение с помощью const):

https://github.com/facebook/regenerator/issues/375#issuecomment-527209159