# Eclipse Vert.x
Όπως θα έπρεπε να είναι σαφές σε αυτό το σημείο, το Vert.x είναι το IO και το προεπιλεγμένο μοντέλο προγραμματισμού που χρησιμοποιείται από το ES4X. 56/5000 Υπάρχουν ωστόσο μερικές ωραίες βελτιώσεις στα πρότυπα Vert.x APIs (opens new window).
# Δημιουργημένα API
Όλα τα API που δημοσιεύτηκαν στο npm
κάτω από τους χώρους ονομάτων @vertx
και @reactiverse
έχουν δημιουργηθεί ap;o κώδικa. Δημιουργία κώδικα είναι ένας βοηθός που επιτρέπει τη χρήση αυτών των API από χρήστες JavaScript
σε μορφή που είναι οικεία χωρίς να διακυβεύεται η
απόδοση της εφαρμογής.
Η αλληλεπίδραση με το JVM συμβαίνει πάνω από το αντικείμενο Java
. Το πιο σημαντικό κομμάτι είναι να χρησιμοποιήστε μια class JVM για JS:
// Εισαγάγετε την class java.lang.Math για να μπορείτε να χρησιμοποιήσετε
// ως τύπος JS
const Math = Java.type('javalang.Math');
Τώρα μπορεί κανείς να το κάνει αυτό για όλα τα API, αλλά υπάρχουν αρκετοί περιορισμοί που προσπαθεί να αντιμετωπίσει το ES4X:
- Επιρρεπής σε λάθη - Κάποιος πρέπει να γνωρίζει τα ακριβή API και τους τύπους Java για να τα χρησιμοποιήσει από το JavaScript.
- Δεν υπάρχει τρόπος καθορισμού εξαρτήσεων - Εάν πρέπει να χρησιμοποιήσετε API από διαφορετικές ενότητες, η εισαγωγή class ανά class δεν μπορεί να καθορίσει τις εξαρτήσεις μεταξύ τους.
- Χωρίς υποστήριξη IDE - Ο προγραμματιστής θα πρέπει να γνωρίζει το API πριν το χρησιμοποιήσει γιατί το IDE δεν θα βοηθήσει.
Ο δημιουργός ES4X το επιλύει δημιουργώντας μια ενότητα npm
για κάθε ενότητα vertx
και ορισμούς τύπων για κάθε τάξη.
Κάθε ενότητα θα έχει τα ακόλουθα αρχεία:
package.json
- Ορίζει τις εξαρτήσεις μεταξύ των ενοτήτωνindex.js
- commonjs API interfacesindex.mjs
- ESM API interfacesindex.d.ts
- Πλήρης ορισμοί τύπων για τα API interfacesenum.js
- commonjs API enumerationsenum.mjs
- ESM API enumerationsenum.d.ts
- Πλήρης ορισμοί τύπων για το API enumerationsoptions.js
- commonjs API αντικείμενα δεδομένων.options.mjs
- ESM API αντικείμενα δεδομένων.options.d.ts
- Πλήρης ορισμοί τύπων για τα API αντικείμενα δεδομένων.
Όλα τα αρχεία index
θα απλοποιήσουν την εισαγωγή JVM classes αντικαθιστώντας, για παράδειγμα:
// χωρίς ES4X
const Router = Java.type('io.vertx.ext.web.Router');
// me
import { Router } from '@vertx/web';
Αυτή η μικρή αλλαγή θα κάνει τους IDE να βοηθήσουν στην ανάπτυξη και στους διαχειριστές πακέτων να κατεβάσουν εξαρτήσεις ανάλογα με τις ανάγκες τους.
Τέλος, όλα τα αρχεία .d.ts
θα υποδείξουν το IDE σχετικά με τους τύπους και θα υποστηρίξουν την ολοκλήρωση κώδικα.
# Promise/Future
Vert.x έχει 2 τύπους:
io.vertx.core.Future
io.vertx.core.Promise
Παραδόξως, ένα Vert.x Promise
δεν είναι το ίδιο με ένα JavaScript Future
. Ένα Vert.x Promise
είναι η εγγράψιμη πλευρά του
Vert.x Future
. Σε όρους JavaScript:
- Vert.x
Future
=== JavaScriptΣαν υπόσχεση (Thenable)
- Vert.x
Promise
=== JavaScriptΛειτουργία Executor
# async/await
async/await
υποστηρίζεται χωρίς καμία ανάγκη για compilation step από το GraalVM
. ES4X προσθέτει ένα επιπλέον χαρακτηριστικό στον Vert.x
Future
τύπο. API που επιστρέφουν Vert.x Future
μπορούν να χρησιμοποιηθούν ως Thenable
, αυτό σημαίνει ότι:
// χρησιμοποιώντας το Java API
vertx.createHttpServer()
.listen(0)
.onSuccess(server => {
console.log('Server ready!')
})
.onFailure(err => {
console.log('Server startup failed!')
});
Μπορεί να χρησιμοποιηθεί ως Thenable
:
try {
let server = await vertx
.createHttpServer()
.listen(0);
console.log('Server Ready!');
} catch (err) {
console.log('Server startup failed!')
}
:::υπόδειξη
async/await
λειτουργεί ακόμη και με loops, γεγονός που καθιστά την εργασία με ασύγχρονο κώδικα αρκετά εύκολη, ακόμη και ανάμειξη κώδικα JS και Java.
:::
# Μετατροπές Τύπων
Vert.x κωδικοποιείται σε Java
, ωστόσο σε JavaScript
δεν χρειάζεται να ανησυχούμε για τους τύπους όσο στην Java
. Το ES4X
εκτελεί ορισμένες αυτόματες μετατροπές εκτός πλαισίου:
Java | TypeScript |
---|---|
void | void |
boolean | boolean |
byte | number |
short | number |
int | number |
long | number |
float | number |
double | number |
char | string |
boolean[] | boolean[] |
byte[] | number[] |
short[] | number[] |
int[] | number[] |
long[] | number[] |
float[] | number[] |
double[] | number[] |
char[] | string[] |
java.lang.Void | void |
java.lang.Object | any |
java.lang.Boolean | boolean |
java.lang.Double | number |
java.lang.Float | number |
java.lang.Integer | number |
java.lang.Long | number |
java.lang.Short | number |
java.lang.Char | string |
java.lang.String | string |
java.lang.CharSequence | string |
java.lang.Boolean[] | boolean[] |
java.lang.Double[] | number[] |
java.lang.Float[] | number[] |
java.lang.Integer[] | number[] |
java.lang.Long[] | number[] |
java.lang.Short[] | number[] |
java.lang.Char[] | string[] |
java.lang.String[] | string[] |
java.lang.CharSequence[] | string[] |
java.lang.Object[] | any[] |
java.lang.Iterable | any[] |
java.util.function.BiConsumer | <T extends any, U extends any>(arg0: T, arg1: U) => void |
java.util.function.BiFunction | <T extends any, U extends any, R extends any>(arg0: T, arg1: U) => R |
java.util.function.BinaryOperator | <T extends any>(arg0: T, arg1: T) => T |
java.util.function.BiPredicate | <T extends any, U extends any>(arg0: T, arg1: U) => boolean |
java.util.function.Consumer | <T extends any>(arg0: T) => void |
java.util.function.Function | <T extends any, R extends any>(arg0: T) => R |
java.util.function.Predicate | <T extends any>(arg0: T) => boolean |
java.util.function.Supplier | <T extends any>() => T |
java.util.function.UnaryOperator | <T extends any>(arg0: T) => T |
java.time.Instant | Date |
java.time.LocalDate | Date |
java.time.LocalDateTime | Date |
java.time.ZonedDateTime | Date |
java.lang.Iterable<T> | <T>[] |
java.util.Collection<T> | <T>[] |
java.util.List<T> | <T>[] |
java.util.Map<K, V> | { [key: <K>]: <V> } |