问题
Basically I'm trying to figure out what I need to pass to the onload()
method
def selectedFile(e: ReactEventI) = {
val reader = new dom.FileReader()
reader.readAsText(e.currentTarget.files.item(0))
reader.onload(
)
}
回答1:
You can assign a lambda to the onload
handler:
reader.onload = (e: UIEvent) => {
// Cast is OK, since we are calling readAsText
val contents = reader.result.asInstanceOf[String]
println(contents)
}
回答2:
Idiomatic Scala, with error handling
Instead of using callbacks, I prefer to work with pattern matching and map
like this:
def printFileContent(file: dom.File) =
readTextFile(file).map {
case Right(fileContent) => println(s"File content: $fileContent")
case Left(error) => println(s"Could not read file ${file.name}. Error: $error")
}
Code:
/** In the future, returns either the file's content or an error,
if something went wrong */
def readTextFile(fileToRead: dom.File): Future[Either[DOMError, String]] = {
// Used to create the Future containing either the file content or an error
val promisedErrorOrContent = Promise[Either[DOMError, String]]
val reader = new FileReader()
reader.readAsText(fileToRead, "UTF-8")
reader.onload = (_: UIEvent) => {
val resultAsString = s"${reader.result}"
promisedErrorOrContent.success(Right(resultAsString))
}
reader.onerror = (_: Event) => promisedErrorOrContent.success(Left(reader.error))
promisedErrorOrContent.future
}
来源:https://stackoverflow.com/questions/30332326/how-can-i-read-a-text-file-with-scala-js