Hmm. Beachten Sie, dass das Async-Flag längst veraltet ist. Ich hatte nicht bemerkt, dass es überhaupt noch verfügbar war. Aber wenn man das liest, dann ist das grob gesagt. (Offensichtlich ungetestet; passen Sie es an die Realität Ihrer Situation an.)
Mein Eindruck von Ihrer Beschreibung ist, dass das Ergebnis eine JSON-Zeichenfolge ist, die tatsächlich ein Array codiert. Wenn das der Fall, ist der erste Schritt, das analysieren:
val rawArray:js.Dynamic = JSON.parse(res)
dass der JSON-String parst, und gibt Ihnen ein js.Dynamic
, die die „rohe“ Form eines JS-Objekts ist. Zu diesem Zeitpunkt weiß Scala.js nichts über seine Struktur.
Als nächstes sollten Sie Scala.js beschreiben, was die Struktur jedes Element Ihres Arrays wie folgt aussieht:
@js.native
trait MyStruct extends js.Object {
val name:String = js.native
}
Dies ist, wie Sie Scala.js über einen JavaScript-Typ anweisen. Sie sagen es, dass dieser Typ eine Eigenschaft namens "name" hat, die eine Zeichenfolge ist. Sie können die anderen Felder des Typs hinzufügen oder nicht, wie Sie bevorzugen - da es so klingt, als ob Sie nur name
interessieren, müssen Sie den Rest nicht auflisten.
Dann sagen Sie Scala.js was Ihr rawArray
wirklich ist:
val myArray = rawArray.asInstanceOf[js.Array[MyStruct]]
asInstanceOf
nicht Änderung nichts - es ist einfach zu Scala.js erklärte: „Ich weiß, dass diese js. Dynamic ist eigentlich ein Array von MyStruct ". So, jetzt haben Sie myArray
, die ein js.Array[MyStruct]
ist, und Sie können map
als normal verwenden:
val myNames = myArray.map(_.name)
Diese Art von Sachen ist ziemlich normal, wenn Sie an der Grenze von Scala.js und roh JavaScript arbeiten. Da die JS-Ebene vollständig untypisiert ist und die SJS-Ebene stark typisiert ist, müssen Sie SJS "beibringen", was die tatsächlichen Typen sind, die aus der JS-Ebene kommen. Dann kannst du einfach diese Typen im Rest des SJS-Codes annehmen ...
Danke, das sieht vielversprechend aus. Ich bin im Moment beschäftigt, werde es aber in den nächsten Tagen noch einmal anschauen. – ceran
Funktioniert perfekt, danke – ceran