# Παγκόσμια
To GraalJS είναι καθαρή JavaScript. Αυτό σημαίνει ότι μερικά παγκόσμια αντικείμενα (που δεν είναι τυπικά αλλά κοινά) λείπουν. Το ES4X προσπάθησε να προσθέσει τα χαρακτηριστικά που λείπουν ή βελτίωσε τις προεπιλογές ως εξής:
# require()
Η επίσημη προδιαγραφή δεν καθορίζει την μέθοδο require()
, το ES4X έχει τη δική του εφαρμογή όπως περιγράφεται στο
commonjs.
# setTimeout()
Η setTimeout()
μέθοδος ορίζει ένα χρονόμετρο που εκτελεί μια συνάρτηση ή ένα καθορισμένο κομμάτι κώδικα μόλις λήξει ο χρονοδιακόπτης.
Αυτή η μέθοδος προστίθεται στο παγκόσμιο πεδίο και χρησιμοποιεί Vert.x Timers
:
setTimeout(handler => {
console.log('Hello from the future!')
}, 2000);
# setInterval()
Η setInterval()
μέθοδος ορίζει ένα χρονόμετρο που εκτελεί μια συνάρτηση ή ένα καθορισμένο κομμάτι κώδικα επαναλαμβανόμενα με το χρονόμετρο.
Αυτή η μέθοδος προστίθεται στο παγκόσμιο πεδίο και χρησιμοποιεί Vert.x Timers
:
setInterval(handler => {
console.log('Hello again from the future!')
}, 2000);
# setImmediate()
Η setImmediate()
μέθοδος εκτελεί μια συνάρτηση ή ένα καθορισμένο κομμάτι κώδικα στον επόμενο κύκλο.
Αυτή η μέθοδος προστίθεται στο παγκόσμιο πεδίο και χρησιμοποιεί Vert.x executeOnContext()
:
setImmediate(handler => {
console.log('Hello again from the future!')
});
# clearTimeout()
Διαγράφει ένα χρονικό όριο.
# clearInterval()
Διαγράφει ένα χρονικό όριο.
# clearImmediate()
WARNING
Αυτή η λειτουργία είναι παρούσα για να διασφαλιστεί ότι πολλές βιβλιοθήκες δεν θα σπάσουν, ΑΛΛΑ δεν έχει αποτέλεσμα λόγω του τρόπου με τον οποίο οι επιστροφές κλήσεων είναι προγραμματισμένη στον Vert.x Event Loop.
# process Object
Το process object (δημοφιλής από το nodejs
) είναι επίσης διαθέσιμο στο ES4X, ωστόσο, έχει λιγότερες ιδιότητες:
{
env, // μεταβλητές περιβάλλοντος διεργασίας (read only)
pid, // τρέχον process id
engine, // σταθερά 'graaljs'
exit, // συνάρτηση που τερματίζει τη διαδικασία με προαιρετικό κωδικό σφάλματος
nextTick, // ενεργοποιήστε ένα callback που θα εκτελεστεί στην επόμενη υποδοχή του event loop
// ΣΗΜΕΙΩΣΗ: αυτή η συμπεριφορά είναι διαφορετική από αυτήν του nodejs
on, // εκπομπός εκδηλώσεων function binding
stdout, // JVM System.out
stderr, // JVM System.err
stdin, // JVM System.in (ΠΡΟΕΙΔΟΠΟΙΗΣΗ αυτό θα μπλοκάρει το event loop)
properties, // JVM System properties (read, write)
cwd // Λειτουργία που επιστρέφει το CWD
}
# console Object
Η κονσόλα προστίθεται από το ES4X. Αυτό το αντικείμενο έχει το τυπικό API:
console.debug('Hello', 'World', '!')
console.info('Hello', 'World', '!')
console.log('Hello', 'World', '!')
console.warn('Hello', 'World', '!')
console.error('Hello', 'World', '!')
Stack traces (από το JS και το JVM) μπορούν να εκτυπωθούν με:
try {
throw new Error('durp!')
} catch (e) {
console.trace(e);
}
# Async Error Tracing
Φανταστείτε το ακόλουθο κομμάτι κώδικα:
function one() {
two(function(err) {
if(err) throw err;
console.log("two finished");
});
}
function two(callback) {
setTimeout(function () {
three(function(err) {
if(err) return callback(err);
console.log("three finished");
callback();
});
}, 0);
}
function three(callback)
{
setTimeout(function () {
four(function(err) {
if(err) return callback(err);
console.log("four finished");
callback();
});
}, 0);
}
function four(callback) {
setTimeout(function(){
callback(new Error());
}, 0);
}
one();
73/5000 Εάν εκτελέσετε αυτόν τον κώδικα, θα δείτε ότι το σφάλμα σας έχει το ακόλουθο ίχνος:
Error
at Timer.callback (example.js:34)
Το οποίο δεν είναι πολύ χρήσιμο αν πρέπει να κάνετε debug.
Για να διευκολυνθεί αυτό υπάρχει μια ομαδοποιημένη μονάδα με το ES4X που θα συνδυάσει τις εξαιρέσεις σας μαζί, κάθε φορά που θα χειρίζατε ένα callback 37/5000 αντί να περάσετε το λάθος άμεσα το τυλίγετε με μια helper function.
var asyncError = require('async-error');
var fs = vertx.fileSystem();
function one() {
two(function (err) {
if (err) {
console.trace(err);
test.complete();
return;
}
console.log("two finished");
should.fail("Should not reach here");
});
}
function two(callback) {
setTimeout(function () {
three(function (err) {
if (err) {
setTimeout(function () {
callback(asyncError(err));
}, 0);
return;
}
console.log("three finished");
callback();
});
}, 0);
}
function three(callback) {
setTimeout(function () {
four(function (err) {
if (err) {
setTimeout(function () {
callback(asyncError(err));
}, 0);
return;
}
console.log("four finished");
callback();
});
}, 0);
}
function four(callback) {
setTimeout(function () {
fs.readFile("durpa/durp.txt", function (ar) {
if (ar.failed()) {
callback(asyncError(ar));
}
});
}, 0);
}
one();
Γνωρίζοντας ότι το αρχείο durpa/durp.txt
δεν υπάρχει, τώρα θα δείτε:
Error: File not found!
at stacktraces/jserror.js:24:20
at stacktraces/jserror.js:40:20
at stacktraces/jserror.js:53:14
at stacktraces/jserror.js:53:25
at classpath:io/reactiverse/es4x/polyfill/global.js:25:18
Εάν το σφάλμα που διαδίδεται σε ένα JS σφάλμα
object ή:
io.vertx.core.file.FileSystemException: java.nio.file.NoSuchFileException: durpa/durp.txt
at <async>.<anonymous> (stacktraces/index.js:30)
at <async>.<anonymous> (stacktraces/index.js:46)
at <async>.<anonymous> (stacktraces/index.js:61)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:740)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:732)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:275)
at io.vertx.core.impl.TaskQueue.run(TaskQueue.java:76)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.nio.file.NoSuchFileException: durpa/durp.txt
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
at java.nio.file.Files.newByteChannel(Files.java:361)
at java.nio.file.Files.newByteChannel(Files.java:407)
at java.nio.file.Files.readAllBytes(Files.java:3152)
at io.vertx.core.file.impl.FileSystemImpl$13.perform(FileSystemImpl.java:736)
... 7 more
Εάν το σφάλμα είναι Java Throwable.
# Date
Πολλά APIs από Vert.x επιστρέφουν έναν Instant
ως χρονικός τύπο, για να το χρησιμοποιήσετε από JS μια στατική helper functionπροστίθεται στο Date
αντικείμενο:
let instant = someJVMInstant
let d = Date.fromInstant(instant)
# ArrayBuffer
Οι Array buffers είναι ένας ενσωματωμένος τύπος, ωστόσο, εάν απαιτείται interop, τοτε μια JVM ByteArray
πρέπει να περάσει στον κατασκευαστή και αυτό επιτρέπει την πρόσβαση στο υποκείμενο buffer χωρίς αντίγραφα:
let javaBuffer = someJavaBuffer
let b = new ArrayBuffer(javaBuffer)
// το υποκείμενο buffer μπορεί να διαβαστεί χρησιμοποιώντας
b.nioByteBuffer