#javascript #rust #error-handling #boolean #rust-result
Вопрос:
Я снова занимаюсь автоматизацией Selenium в JavaScript, и у меня есть несколько методов, которые возвращают логические значения для веб-страницы. Например, у меня есть метод isB2B (), который возвращает, предназначена ли форма заказа, которую я автоматизирую, для заказа B2B. Он полагается на частный метод #getMarketType (), который возвращает либо тип рынка в виде строки, либо значение false, в зависимости от того, удалось ли ему получить тип рынка со страницы с помощью Selenium. Я хотел бы, чтобы возвращаемое значение для метода isB2B() указывало как значение успеха поиска, так и то, был ли тип рынка B2B. В Rust я бы использовал перечисление
Result<bool, ()>
который может иметь любой из вариантов
Ok(bool)
или
Err(())
Как я могу добиться аналогичной функциональности в JavaScript?
Комментарии:
1. Я не думаю, что вы действительно можете сделать что-то эквивалентное на любом динамически типизированном языке, таком как JS. Идиоматический способ JS для обработки этих конкретных ситуаций, вероятно, состоял бы в том, чтобы создать исключение в случае ошибки, а затем попытаться обработать его в любых функциях, которые вызывают эту.
2. Вы всегда можете определить свой собственный
Result
объект в JS с помощью функций для управления им, как это делает Rust. Это то, что вы исследовали?3. Вы можете вернуть объект, например
{success: true}
, при успешном выполнении или{error: {}}
при сбое, и проверитьtypeof result.error != "undefined"
, не произошла ли ошибка. Другим способом было бы просто вернуть логическое значение или объект ошибки в зависимости от того, был ли он успешным, и проверитьtypeof result == "object"
, была ли это ошибка. Другим способом было бы передать два параметра обратного вызова (один для успешного выполнения, а другой для сбоя) и вызвать соответствующий обратный вызов в зависимости от того, была ли функция успешной.4. Все эти комментарии были полезны, спасибо! @loganfsmyth Я думал об этом, но я хотел сделать что-то, что не полностью смутило бы разработчика JavaScript, когда они это увидели. Я использовал классы es6 со статическими членами для работы как перечисления, и я готов поспорить, что с некоторыми доработками я мог бы добиться результата.
5. @BenjaminPeinhardt Это не было бы совсем запутанным, просто немного не мейнстрим. Существует множество библиотек функционального программирования, которые поставляют
Result
илиEither
структурируют данные.