Это моя небольшая функция / класс twilio, возвращающая обещание, которое я импортирую в другой файл. Я получаю err и res здесь, возвращая его в качестве обещания
class TwilioService {
sendSms(to, message) {
return this.twilio.sendMessage(sms,(err,res) => {
return new Promise((resolve, reject) => {
if (err) {
console.info(err)
return resolve(res)
} else {
console.info(res, 'ppppppppppppppppp')
return reject(res)
}
})
})
}
}
Теперь это моя функция, в которой я использую эту функцию.
Но когда я делаю console.info(sendSms), я получаю undefined в консоли, даже когда возвращаю обещание из функции twilio. Что я здесь делаю не так.
import Twilio from '../../services/twilio'
const twilio = new Twilio()
const handler = async(request, reply) => {
try {
const sendSms = await twilio.sendSms(`+91${mobile}`, `Welcome to App. User ${verificationCode} as your signup OTP.`)
console.info(sendSms, 'oooooooooooooooo')
} catch(err) {
console.info(err)
}
}
Пожалуйста помоги!!! Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В настоящий момент вы возвращаете Перезвоните, который, вероятно, не возвращает Promise - измените порядок, верните Promise, который разрешается при выполнении обратного вызова sendMessage. Также обратите внимание, что вам следует reject, если есть err и resolve с res, если нет err, а не наоборот:
class TwilioService {
sendSms(to, message) {
return new Promise((resolve, reject) => { // switch these two lines
return this.twilio.sendMessage(sms, (err, res) => { // switch these two lines
if (err) {
console.info(err)
return reject(res) // reject on error, don't resolve
} else {
console.info(res, 'ppppppppppppppppp')
return resolve(res) // resolve when there's no error
}
})
})
}
}
Правильно - когда Promise отклоняет, если этот Promise находится в другом месте, эта строка await выдаст ошибку (ошибка, с которой был вызван await), и эту ошибку можно поймать, если строка reject находится в блоке await, поэтому поток продолжится в блоке try, так как ваш код работает правильно.
Последний вопрос: могу ли я сделать sendSms асинхронным и возвращать из него значение вместо использования синтаксиса new Promise? Поскольку сама функция async возвращает обещание
К сожалению, нет - хотя функция async действительно возвращает Promise автоматически, этот Promise не привязан ни к чему, кроме асинхронных await в функции async. Единственный способ сделать это - использовать await в new Promise((resolve, ..., но в этом случае проще сделать sendSms стандартной функцией и просто вернуть созданный Promise. (У вас нет доступа к эквиваленту resolve, когда вы используете функцию async, но вы необходимость вызываемого resolve при преобразовании обратного вызова в Promise)
Это просто круто. Вы ответили через минуту. Великий понимающий человек. Последний вопрос отклонит ошибку выброса в части улова асинхронной функции? Приму через 5 минут