Funktion asynchron ausführen

JavaScriptJavaScriptBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man langlaufende Funktionen asynchron mithilfe eines Web Workers ausführt. Ziel des Labs ist es, Entwicklern zu beibringen, Funktionen in einem separaten Thread auszuführen, um so die Blockierung der Benutzeroberfläche während der Ausführung der Funktion zu vermeiden. Das Lab bietet ein praktisches Beispiel dafür, wie man einen Web Worker erstellt und ihn verwendet, um eine Funktion auszuführen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("JavaScript")) -.-> javascript/AdvancedConceptsGroup(["Advanced Concepts"]) javascript(("JavaScript")) -.-> javascript/ToolsandEnvironmentGroup(["Tools and Environment"]) javascript(("JavaScript")) -.-> javascript/BasicConceptsGroup(["Basic Concepts"]) javascript/BasicConceptsGroup -.-> javascript/variables("Variables") javascript/BasicConceptsGroup -.-> javascript/data_types("Data Types") javascript/BasicConceptsGroup -.-> javascript/arith_ops("Arithmetic Operators") javascript/BasicConceptsGroup -.-> javascript/comp_ops("Comparison Operators") javascript/BasicConceptsGroup -.-> javascript/loops("Loops") javascript/BasicConceptsGroup -.-> javascript/obj_manip("Object Manipulation") javascript/AdvancedConceptsGroup -.-> javascript/async_prog("Asynchronous Programming") javascript/AdvancedConceptsGroup -.-> javascript/template_lit("Template Literals") javascript/ToolsandEnvironmentGroup -.-> javascript/debugging("Debugging") subgraph Lab Skills javascript/variables -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/data_types -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/arith_ops -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/comp_ops -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/loops -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/obj_manip -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/async_prog -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/template_lit -.-> lab-28606{{"Funktion asynchron ausführen"}} javascript/debugging -.-> lab-28606{{"Funktion asynchron ausführen"}} end

Asynchrone Funktionsausführung mit Web Workers

Um eine Funktion auszuführen, ohne die Benutzeroberfläche zu blockieren, verwenden Sie einen Web Worker, um die Funktion in einem separaten Thread auszuführen. So geht es:

  1. Erstellen Sie einen Worker mithilfe einer Blob-Objekt-URL, wobei der Inhalt die stringifizierte Version der auszuführenden Funktion ist.
  2. Geben Sie sofort den Rückgabewert des aufgerufenen Funktionsaufrufs zurück.
  3. Geben Sie ein Promise zurück, hören Sie auf onmessage- und onerror-Ereignisse und lösen Sie die von der Worker zurückgesendeten Daten auf, oder werfen Sie einen Fehler.
const runAsync = (fn) => {
  const worker = new Worker(
    URL.createObjectURL(new Blob([`postMessage((${fn})());`]), {
      type: "application/javascript; charset=utf-8"
    })
  );
  return new Promise((resolve, reject) => {
    worker.onmessage = ({ data }) => {
      resolve(data);
      worker.terminate();
    };
    worker.onerror = (error) => {
      reject(error);
      worker.terminate();
    };
  });
};

Beachten Sie, dass die an runAsync übergebene Funktion keine Closures verwenden sollte, da alles stringifiziert und zu einem Literal wird. Daher müssen alle Variablen und Funktionen innerhalb definiert werden. Hier sind einige Beispiele:

const longRunningFunction = () => {
  let result = 0;
  for (let i = 0; i < 1000; i++)
    for (let j = 0; j < 700; j++)
      for (let k = 0; k < 300; k++) result = result + i + j + k;

  return result;
};

runAsync(longRunningFunction).then(console.log); // 209685000000
runAsync(() => 10 ** 3).then(console.log); // 1000
let outsideVariable = 50;
runAsync(() => typeof outsideVariable).then(console.log); // 'undefined'

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Lab "Run Function Asynchronously" abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.