Я пытаюсь понять, как функция .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.
Это сайт, который я пытаюсь изучить.
Использовать Попробуйте поймать
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-интерфейсы на основе обратного вызова в промисы, чтобы вы могли использовать промисы для всего вашего потока управления, а не модели смешивания/сопоставления (что, как правило, серьезно усложняет хорошую обработку ошибок при смешивании моделей).
@CesarePolonara - Ну, вы не показываете полный набор реального кода, но тот факт, что код имеет два предопределенных обратных вызова, один для успеха и один для отказа, и вы пытаетесь вызвать их справа время для двух моделей создает впечатление, что это не собственный код обещания, а скорее вызывающая сторона передает два обратных вызова, и вы пытаетесь вызвать их в нужное время. Это не будет интерфейс промиса — это будет интерфейс обратного вызова. Вместо этого просто верните обещание и позвольте вызывающей стороне использовать обещание по мере необходимости. Итак, этот код не вызывает обратные вызовы.
Я не автор вопроса. Хорошо, теперь я понял, что вы имеете в виду, но с асинхронными функциями (которые в любом случае возвращают обещания) есть некоторые сценарии, в которых вы вынуждены иметь нечистые асинхронные функции с обратными вызовами побочных эффектов внутри них.
Хороший ответ, но мне непонятно, что вы имеете в виду под «не хотите преобразовывать обещания в обратные вызовы».