Rolf B: dynamische Module node

Beitrag lesen

Hallo effel,

du hast den Mechanismus vermutlich noch nicht ganz verstanden, das schließe ich aus deiner Unklarheit.

Ich versuche mal, die ganzen Zwischenwerte, mit denen in den bisherigen Beispielen heimlich operiert wurde, in Variablen zwischenzuspeichern um sie sichtbarer zu machen.

Ein Hinweis noch: Setze vor Beispielcode eine Zeile ~~~js und dahinter eine Zeile mit ~~~, dann wird das Beispiel ordentlich als JavaScript formatiert.

Also:

let modulPromise, thenPromise;

modulPromise = import('./dr_konstruk2.js');

function erfolgsCallback(modul) {
   modul.dr_konstruk2(arg1, ADA, dr_lesen, vergl, dr_x_y_norm,
                      arraino, dr_append, div, sub, abs);
}

thenPromise = modulPromise.then(erfolgsCallback);

Von import() bekommst Du ein Promise-Objekt für das Modul. Dieses Promise hat eine Methode then, und dieser then-Methode übergibst Du eine Funktion, die im Erfolgsfall aufzurufen ist und der das importierte Dings übergeben wird.

Dieses Dings ist ein "Modul-Namespace" Objekt. Es ist ein Objekt, das all das enthält, was vom importierten Modul exportiert wird. D.h. wenn Du on dr_konstruk2.js stehen hast

export function dr_konstruk2(a,b,c,d) { ... }

dann findest Du in modul.dr_konstruk2 die exportierte Funktion. Ob das Namespace-Objekt nun modul heißt oder konstrukt oder hans, ist natürlich wurscht.

Dieses Namespace-Objekt ist aber erst beim Aufruf der Callback-Funktion verfügbar, die Du an then übergibst, und auch nur von ihr. Ganz wichtig: Du übergibst die Funktion, nicht den Wert ihres Aufrufs. Du schreibst .then(erfolgsCallback), da ist kein Klammerpaar hinter dem Funktionsnamen. Eine JavaScript-Funktion ist selbst ein Objekt, und genau dieses Objekt wird an then übergeben. Den Aufruf übernimmt then, sobald das Modul da ist. Und deswegen ist .then(p_dr_konstruk2.dr_konstruk2(a,b,c,d)) sinnlos, weil Du JavaScript damit anweist, die Methode dr_konstruk2 des Objekts p_dr_konstruk2 aufzurufen und deren Rückgabewert an then zu übergeben. Ich glaube nicht, dass Du das willst. Man kann solche Konstrukte zwar errichten, aber dann müsste die Methode bereits vor dem Import verfügbar sein und die Methode müsste eine Funktion höherer Ordnung sein, d.h. eine Funktion, die eine andere Funktion als Rückgabewert hat. Kann man machen, ja, aber das ist das JavaScript-Gegenstück zur höheren Mathematik.

Zum Abschluss noch etwas zu dieser Variablen thenPromise: then gibst seinerseits ein Promise zurück. Sein Wert wird festgelegt, wenn die Callback-Funktion endet, die Du an then übergeben hast. Ob es erfüllt oder zurückgewiesen wird, hängt vom Rückgabewert des Callbacks ab. Du kannst auf diese Weise asynchrone Vorgänge zu einer Kette verknüpfen. In dem Wiki-Artikel, den ich verlinkte, steht was dazu, es ist aber schon eine komplexere Anwendung von Promises.

Sinnvoll ist hingegen sowas:

import('./modul.js')
.then(function(modul) {
   ... modul verwenden
})
.catch(function(error) {
   ... Fehler protokollieren
});

Die catch-Methode legt einen Callback für den Fall fest, dass ein Promise nicht erfüllt wird, sondern scheitert. Wenn man das so wie gezeigt schreibt, dann kann dies das Scheitern von import() sein (modul.js existiert nicht oder enthält einen Syntaxfehler) oder auch das Scheitern des then-Callbacks. In beiden Fällen läuft er in den catch-Callback und Du kannst den Fehler protokollieren.

Rolf

--
sumpsi - posui - obstruxi