Общепринято для проверки аргументов и возврата ошибок в функциях.Обработка ошибок обратного вызова JavaScript
Однако в функции обратного вызова JavaScript, таких как:
function myFunction(num, callback) {
if (typeof num !== 'number') return callback(new Error('invalid num'))
// do something else asynchronously and callback(null, result)
}
Я написал много функций, как это, но мне интересно, если есть что-то потенциально вредно. Поскольку в большинстве случаев вызывающий абонент предполагает, что это асинхронная функция, а обратный вызов будет выполняться после кода сразу после вызова функции. Но если некоторые аргументы недействительны, функция немедленно вызовет обратный вызов. Таким образом, вызывающий абонент должен быть осторожным с ситуацией, то есть с неожиданной последовательностью выполнения.
Я хочу услышать некоторые советы по этой проблеме. Должен ли я тщательно предположить, что все асинхронные обратные вызовы могут быть выполнены немедленно? Или я должен использовать что-то вроде setTimeout (..., 0) для преобразования синхронной вещи в асинхронную. Или есть лучшее решение, о котором я не знаю. Благодарю.
Я удалил свой нижний план. Я предполагаю, что валидация того, как называется функция, достаточно серьезна, чтобы бросить и не должна произойти в процессе производства. –
@PatrickRoberts: Я удалил эту часть ответа, это не имело никакого отношения к вопросу. Я вижу вашу точку зрения, хотя я не согласен с ней; Мне нужно больше думать об этом. Я отмечаю, что если вы выбрали во время установки ES2015 Promise ('let p = new Promise (resolve => {throw new Error();})'), он преобразуется в отклонение конструктором Promise, который поддерживает ваш аргумент в пользу единственного канала ошибки, учитывая мысли и опыт, которые вошли в дизайн этого API ... –
Мой подход также неверен. Как заметил мне комментатор, callstack - это что-то очень важное для рассмотрения, особенно когда разработчик, использующий вашу функцию, пытается повторно выполнить повторную попытку, в конечном итоге приводит к переходу stackoverflow, если ваша функция синхронна при ее ошибках. –