Javascript - измените две функции, а затем / поймайте стиль на асинхронный / ожидающий стиль

Я пытаюсь понять, как функция .then() может получить два таких аргумента.

const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);

или

const promise2 = doSomething().then(successCallback, failureCallback);

но я хочу преобразовать два аргумента .then() в async/await вот так.

const result = await doSomething()
// execute successCallback if success.
// execute failureCallback if failure.

Это сайт, который я пытаюсь изучить.

Разработчик Mozilla Firefox: использование обещания

Разработчик Mozilla Firefox: цепочка промисов

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
37
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Использовать Попробуйте поймать

try {
  const result = await doSomething()
  // success
  successCallback();
}

catch (e) {
  // error
  failureCallback();

Вы можете обернуть doSomething в методе try catch, чтобы зафиксировать успех и потерпеть неудачу, как это.

try {
const result = await doSomething()
} catch (err) {
console.log(err.message)
}
Ответ принят как подходящий

Когда вы await выполняете промис, вы напрямую получаете его значение:

const result = await doSomething();

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

try {
   const result = await doSomething();
} catch(e) {
   console.log(e);
}

Не рекомендуется сопоставлять обещания с обратными вызовами. Гораздо лучше просто вернуть обещание и позволить вызывающему объекту напрямую обработать обещание с помощью .then() или await.

Если вам действительно нужно сопоставить await с successCallback и failureCallback, вы должны сделать это:

try {
   const result = await doSomething();
   successCallback(result);
} catch(e) {
   failureCallback(e);
}

Но в этот момент вы можете просто использовать .then(), так как это меньше кода:

 doSomething().then(successCallback, failureCallback);

Но, как я уже говорил ранее, вы обычно не хотите отображать промисы в обратные вызовы. Более вероятно, что вы оборачиваете старые API-интерфейсы на основе обратного вызова в промисы, чтобы вы могли использовать промисы для всего вашего потока управления, а не модели смешивания/сопоставления (что, как правило, серьезно усложняет хорошую обработку ошибок при смешивании моделей).

Хороший ответ, но мне непонятно, что вы имеете в виду под «не хотите преобразовывать обещания в обратные вызовы».

Cesare Polonara 10.04.2022 06:54

@CesarePolonara - Ну, вы не показываете полный набор реального кода, но тот факт, что код имеет два предопределенных обратных вызова, один для успеха и один для отказа, и вы пытаетесь вызвать их справа время для двух моделей создает впечатление, что это не собственный код обещания, а скорее вызывающая сторона передает два обратных вызова, и вы пытаетесь вызвать их в нужное время. Это не будет интерфейс промиса — это будет интерфейс обратного вызова. Вместо этого просто верните обещание и позвольте вызывающей стороне использовать обещание по мере необходимости. Итак, этот код не вызывает обратные вызовы.

jfriend00 10.04.2022 07:01

Я не автор вопроса. Хорошо, теперь я понял, что вы имеете в виду, но с асинхронными функциями (которые в любом случае возвращают обещания) есть некоторые сценарии, в которых вы вынуждены иметь нечистые асинхронные функции с обратными вызовами побочных эффектов внутри них.

Cesare Polonara 10.04.2022 07:26

Другие вопросы по теме