Я пытаюсь написать фасад Scalajs для библиотеки request , в которой есть метод с использованием шаблона обратного вызова:
request('http://www.google.com', function (error, response, body) {
console.log('error:', error); // Print the error if one occurred
console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
console.log('body:', body); // Print the HTML for the Google homepage.
});
В этом шаблоне либо error
равно нулю, аresponse
и body
определены или наоборот.
Как лучше всего отразить этот рисунок на фасаде ScalaJS? Лучшее, что я могу придумать, это:
@js.native
@JSImport("request", JSImport.Default)
object Request extends js.Object {
def apply[A](uri: String,
requestConfig: js.Object,
callback: js.Function2[js.JavaScriptException, Response, A]): Unit = js.native
}
После выполнения метода я затем использую Option
, чтобы сопоставить правильный регистр:
Request(url, RequestConfig(queryString, headers), (error, response) => {
(Option(error), Option(response)) match {
case (Some(err), _) => // handle error
case (_, Some(res)) => // handle success
case (None, None) => // This will only happen if there is a bug in the request library
}
})
Мне это не нравится, потому что1) Я должен написать ненужное совпадение для (None, None)
или проигнорировать предупреждение о неисчерпывающем совпадении и 2) фасад не точно описывает типы.
Я также пытался использовать js.UndefOr[js.JavaScriptException]
, но этовозвращает Some(null)
из .toOption
и js.JavaScriptException | Null
, но я могу только преобразовать это в Option[js.JavaScriptException | Null]
.