# Παγκόσμια

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