Giter VIP home page Giter VIP logo

Comments (7)

strenkel avatar strenkel commented on June 12, 2024

from jshero.

Paratron avatar Paratron commented on June 12, 2024

Dazu hätte ich eine Idee: Kannst du nicht zur Code-Ausführung einen iFrame platzieren und darin einen Script-Tag erzeugen, in welchen du den Code injizierst? Dann sparst du dir eval und hast den Vorteil dass aufgrund des iFrame der Code etwas abgeschottet läuft.

Wenn du den Code dann noch dekorierst, wie z.b. hier:

(() => {
    // ORIGINALER USERCODE HIER EINFÜGEN

    // Hier kommen die Prüfroutinen:
    if(typeof quersumme !== 'function'){
        jsheroApi.reportError('quersumme ist keine Funktion!');
    }
})();

Dann kannst du deine Prüfroutinen einfach unter den User-Code kleben und im gleichen Scope ausführen. Calls zu jsheroApi wären dann dafür zuständig Nachrichten aus dem iFrame heraus nach "oben" zum Kurs zu kommunizieren.

from jshero.

strenkel avatar strenkel commented on June 12, 2024

Daran habe ich noch garnicht gedacht (also Code im iFrame laufen lassen). Allerdings führe ich das eval in einem Webworker aus, um Endlosschleifen abzufangen. Geht das auch mit iFrames? Also das ich in der Hauptseite das IFrame nach x Sekunden abschieße, wenn es kein Ergebnis liefert? Sollte eigentlich.

Bisher dachte ich, etwas sowas zu machen (alles in dem Webworker):

Zuerst ein leeres export Objekt zu definieren. In den Koans selber neben den Tests ein export-Feld hinzuzufügen. Dieses Export-Feld enthält den Namen der zu testenden Funktion. An den User-Code würde ich dann etwas folgende Zeile anfügen (als String):

export.functionUnderTest = koan.export;

... und den User-Code inklusive dieser Zeile in eval ausführen. Dann müsste ich nach dem eval über export.functionUnderTest auf die zu testende Funktion zugreifen können.

(Allerdings muss ich manchmal mehr als nur die zu testende Funktion exportieren. Z.B. Koan #69: Funktionen benutzen Funktionen)

Was ist besser?

from jshero.

Paratron avatar Paratron commented on June 12, 2024

Naja, das kommt drauf an was dir am Wichtigsten ist...

Ich denke dass auch eine Endlosschleife im iFrame den Tab mit dem Kurs aufhängen würde. Allerdings hast du das Problem, dass du im Webworker komplett vom Browser abgeschottet bist. Das heisst keinerlei Zugriff auf den DOM und/oder window. Also auch sowas wie console.log gibts dann nicht.

Das mag genügen, wenn du einfach nur generell Javascript lehren willst. Aber damit schliesst du aus, dass du auch mal ein wenig auf die Browser API in Javascript eingehst.

from jshero.

strenkel avatar strenkel commented on June 12, 2024

Abfangen von Endlosschleifen ist ein 'Muss'. Mindestens bei Aufgaben, bei denen es um Schleifen geht.
Aber das mit der Browser API stimmt auch. Sowas habe ich im Kopf. Vielleicht muss ich dann beides machen: iFrame und webworker-eval.

from jshero.

Paratron avatar Paratron commented on June 12, 2024

Jep, dachte ich auch grade. Einmal in einen Webworker geben um Endlosschleifen zu erkennen und dann im iFrame ausführen.

from jshero.

strenkel avatar strenkel commented on June 12, 2024

Habe das jetzt mit eval gefixt. Es wird nicht mehr global-eval verwendet, sondern das normale eval. Der Testaufruf wird als String an den Übungscode angehängt und beides zusammen mit eval ausgewertet. Das Ergebnis des Testaufrufs wird durch das eval zurückgegeben.
Als positiven Nebeneffekt ist es nicht mehr möglich, im Übungscode eine Testcode-Variable zu überschreiben (theoretisch schon, praktisch aber wohl nicht). Mögliche Verbesserung wäre noch, eval im strict mode zu verwenden. Die Auswertung im iFrame behalte ich im Hinterkopf.

Nochmals vielen Dank für die Bug-Meldung!!!

from jshero.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.