Inhaltsverzeichnis
1. Rückruffunktion
2、同步回调
同步回调的例子
3、异步回调
异步回调的例子
4、异步回调函数与异步函数
🎜Beispiel für synchrone Rückrufe🎜
🎜Beispiel für einen asynchronen Rückruf🎜
总结
Heim Web-Frontend js-Tutorial Eingehende Analyse von Callback-Funktionen in JavaScript (synchron und asynchron)

Eingehende Analyse von Callback-Funktionen in JavaScript (synchron und asynchron)

Aug 04, 2022 am 10:05 AM
javascript 前端 回调函数

Die Rückruffunktion ist eines der Konzepte, die jeder Front-End-Programmierer kennen sollte. Rückrufe können in Arrays, Timerfunktionen, Versprechen und der Ereignisbehandlung verwendet werden. Dieser Artikel erklärt das Konzept von Rückruffunktionen und hilft Ihnen, zwischen zwei Arten von Rückrufen zu unterscheiden: synchron und asynchron.

Eingehende Analyse von Callback-Funktionen in JavaScript (synchron und asynchron)

1. Rückruffunktion

Schreiben Sie zunächst eine Funktion zur Begrüßung von Personen.

Erstellen Sie einfach eine Funktion greet(name), die den Parameter name akzeptiert. Diese Funktion sollte die Begrüßungsnachricht zurückgeben: name 参数的函数 greet(name)。这个函数应返回打招呼的消息:

function greet(name) {
  return `Hello, ${name}!`;
}

greet('Cristina'); // => 'Hello, Cristina!'
Nach dem Login kopieren

如果向很多人打招呼该怎么办?可以用特殊的数组方法  array.map() 可以实现:

const persons = ['Cristina', 'Ana'];

const messages = persons.map(greet);
messages; // => ['Hello, Cristina!', 'Hello, Ana!']
Nach dem Login kopieren

persons.map(greet) 获取 persons 数组的所有元素,并分别用每个元素作为调用参数来调用 greet() 函数:`greet('Cristina'), greet('Ana')

有意思的是 persons.map(greet) 方法可以接受 greet()  函数作为参数。这样 greet()  就成了回调函数

persons.map(greet) 是用另一个函数作为参数的函数,因此被称为高阶函数

回调函数作为高阶函数的参数,高阶函数通过调用回调函数来执行操作。

重要的是高阶函数负责调用回调,并为其提供正确的参数。

在前面的例子中,高阶函数 persons.map(greet) 负责调用  greet()  函数,并分别把数组中所有的元素 'Cristina'Ana ' 作为参数。

这就为识别回调提供了一条简单的规则。如果你定义了一个函数,并将其作参数提供给另一个函数的话,那么这就创建了一个回调。

你可以自己编写使用回调的高阶函数。下面是 array.map() 方法的等效版本:

function map(array, callback) {
  const mappedArray = [];
  for (const item of array) { 
    mappedArray.push(
      callback(item)    );
  }
  return mappedArray;
}

function greet(name) {
  return `Hello, ${name}!`;
}

const persons = ['Cristina', 'Ana'];

const messages = map(persons, greet);messages; // => ['Hello, Cristina!', 'Hello, Ana!']
Nach dem Login kopieren

map(array, callback) 是一个高阶函数,因为它用回调函数作为参数,然后在其主体内部调用该回调函数:callback(item)

注意,常规函数(用关键字 function 定义)或箭头函数(用粗箭头 => 定义)同样可以作为回调使用。

2、同步回调

回调的调用方式有两种:同步异步回调。

同步回调是“阻塞”的:高阶函数直到回调函数完成后才继续执行。

例如,调用 map()greet() 函数。

function map(array, callback) {
  console.log('map() starts');
  const mappedArray = [];
  for (const item of array) { mappedArray.push(callback(item)) }
  console.log('map() completed');
  return mappedArray;
}

function greet(name) {
  console.log('greet() called');
  return `Hello, ${name}!`;
}

const persons = ['Cristina'];

map(persons, greet);
// logs 'map() starts'
// logs 'greet() called'
// logs 'map() completed'
Nach dem Login kopieren

其中 greet()  是同步回调。

同步回调的步骤:

  • 高阶函数开始执行:'map() starts'

  • 回调函数执行:'greet() called'

  • .最后高阶函数完成它自己的执行过程:'map() completed'

同步回调的例子

许多原生 JavaScript 类型的方法都使用同步回调。

最常用的是 array 的方法,例如: array.map(callback), array.forEach(callback), array.find(callback), array.filter(callback), array.reduce(callback, init)

// Examples of synchronous callbacks on arrays
const persons = ['Ana', 'Elena'];

persons.forEach(
  function callback(name) {    console.log(name);
  }
);
// logs 'Ana'
// logs 'Elena'

const nameStartingA = persons.find(
  function callback(name) {    return name[0].toLowerCase() === 'a';
  }
);
nameStartingA; // => 'Ana'

const countStartingA = persons.reduce(
  function callback(count, name) {    const startsA = name[0].toLowerCase() === 'a';
    return startsA ? count + 1 : count;
  }, 
  0
);
countStartingA; // => 1
Nach dem Login kopieren

字符串类型的 string.replace(callback)  方法也能接受同步执行的回调:

// Examples of synchronous callbacks on strings
const person = 'Cristina';

// Replace 'i' with '1'
person.replace(/./g, 
  function(char) {    return char.toLowerCase() === 'i' ? '1' : char;
  }
); // => 'Cr1st1na'
Nach dem Login kopieren

3、异步回调

异步回调是“非阻塞的”:高阶函数无需等待回调完成即可完成其执行。高阶函数可确保稍后在特定事件上执行回调。

在以下的例子中,later() 函数的执行延迟了 2 秒:

console.log('setTimeout() starts');
setTimeout(function later() {
  console.log('later() called');
}, 2000);
console.log('setTimeout() completed');

// logs 'setTimeout() starts'
// logs 'setTimeout() completed'
// logs 'later() called' (after 2 seconds)
Nach dem Login kopieren

later() 是一个异步回调,因为 setTimeout(later,2000) 启动并完成了执行,但是 later() 在 2 秒后执行。

异步调用回调的步骤:

  • 高阶函数开始执行:'setTimeout()starts'

  • 高阶函数完成其执行: 'setTimeout() completed'

  • 回调函数在 2 秒钟后执行: 'later() called'

异步回调的例子

计时器函数异步调用回调:

setTimeout(function later() {
  console.log('2 seconds have passed!');
}, 2000);
// After 2 seconds logs '2 seconds have passed!' 

setInterval(function repeat() {
  console.log('Every 2 seconds');
}, 2000);
// Each 2 seconds logs 'Every 2 seconds!'
Nach dem Login kopieren

DOM 事件侦听器还异步调用事件处理函数(回调函数的子类型):

const myButton = document.getElementById('myButton');

myButton.addEventListener('click', function handler() {
  console.log('Button clicked!');
});
// Logs 'Button clicked!' when the button is clicked
Nach dem Login kopieren

4、异步回调函数与异步函数

在函数定义之前加上特殊关键字 async

async function fetchUserNames() {
  const resp = await fetch('https://api.github.com/users?per_page=5');
  const users = await resp.json();
  const names = users.map(({ login }) => login);
  console.log(names);
}
Nach dem Login kopieren
Nach dem Login kopieren
Was ist, wenn Sie viele Leute begrüßen? Sie können die spezielle Array-Methode array.map() verwenden, um Folgendes zu erreichen: 🎜
const button = document.getElementById('fetchUsersButton');

button.addEventListener('click', fetchUserNames);
Nach dem Login kopieren
Nach dem Login kopieren
🎜persons.map(greet) Alle Elemente von personsabrufen > array und rufen Sie die Funktion greet() mit jedem Element als Aufrufparameter auf: `greet('Cristina'), greet('Ana'). 🎜🎜Interessanterweise kann die Methode <code>persons.map(greet) die Funktion greet() als Parameter akzeptieren. Auf diese Weise wird greet() zu einer 🎜Rückruffunktion🎜. 🎜🎜persons.map(greet) ist eine Funktion, die eine andere Funktion als Parameter akzeptiert, daher wird sie als 🎜Funktion höherer Ordnung🎜 bezeichnet. 🎜
Callback-Funktion wird als Parameter einer Funktion höherer Ordnung verwendet, und die Funktion höherer Ordnung führt Operationen aus, indem sie die Callback-Funktion aufruft.
🎜Wichtig ist, dass die Funktion höherer Ordnung dafür verantwortlich ist, den Rückruf aufzurufen und ihn mit den richtigen Parametern zu versorgen. 🎜🎜Im vorherigen Beispiel ist die Funktion persons.map(greet) höherer Ordnung für den Aufruf der Funktion greet() und die Zuweisung aller Elemente im Array ' Cristina' und Ana ' als Parameter. 🎜🎜Dies stellt eine einfache Regel zur Identifizierung von Rückrufen dar. Wenn Sie eine Funktion definieren und sie einer anderen Funktion als Parameter zur Verfügung stellen, wird dadurch ein Callback erstellt. 🎜🎜Sie können mithilfe von Rückrufen Ihre eigenen Funktionen höherer Ordnung schreiben. Hier ist die äquivalente Version der Methode array.map(): 🎜rrreee🎜map(array, callback) ist eine Funktion höherer Ordnung, da sie eine Callback-Funktion annimmt Ein Parameter. Die Callback-Funktion wird dann innerhalb ihres Körpers aufgerufen: callback(item). 🎜🎜Beachten Sie, dass auch reguläre Funktionen (definiert mit dem Schlüsselwort function) oder Pfeilfunktionen (definiert mit dem dicken Pfeil =>) als Rückrufe verwendet werden können. 🎜🎜🎜2. Synchroner Rückruf 🎜🎜🎜Es gibt zwei Rückrufmethoden: 🎜synchroner🎜 und 🎜asynchroner🎜Rückruf. 🎜🎜Synchronisierte Rückrufe sind „blockierend“: Die Funktion höherer Ordnung setzt die Ausführung nicht fort, bis die Rückruffunktion abgeschlossen ist. 🎜🎜Rufen Sie beispielsweise die Funktionen map() und greet() auf. 🎜rrreee🎜wobei greet() ein synchroner Rückruf ist. 🎜🎜Schritte für synchronen Rückruf: 🎜
  • 🎜Funktion höherer Ordnung startet die Ausführung: 'map() startet'🎜 li >
  • 🎜Callback-Funktionsausführung: 'greet() aufgerufen'🎜
  • 🎜 Schließlich schließt die Funktion höherer Ordnung ihren eigenen Ausführungsprozess ab: ' map() abgeschlossen'🎜

🎜Beispiel für synchrone Rückrufe🎜

🎜Viele native JavaScript-Typmethoden verwenden synchrone Rückrufe. 🎜🎜Die am häufigsten verwendete Methode ist Array, zum Beispiel: array.map(callback), array.forEach(callback), array.find(callback) , array.filter(callback), array.reduce(callback, init)🎜rrreee🎜string.replace(callback) Die Methode kann auch synchron ausgeführte Rückrufe akzeptieren: 🎜rrreee🎜🎜3. Asynchrone Rückrufe 🎜🎜🎜Asynchrone Rückrufe sind „nicht blockierend“: Funktionen höherer Ordnung können ihre Ausführung abschließen, ohne auf den Abschluss des Rückrufs zu warten. Funktionen höherer Ordnung stellen sicher, dass Rückrufe später bei bestimmten Ereignissen ausgeführt werden. 🎜🎜Im folgenden Beispiel wird die Ausführung der Funktion <code>later() um 2 Sekunden verzögert: 🎜rrreee🎜later() ist ein asynchroner Rückruf, da setTimeout (später, 2000) startet und schließt die Ausführung ab, aber later() wird nach 2 Sekunden ausgeführt. 🎜🎜Schritte zum asynchronen Aufruf eines Rückrufs: 🎜
  • 🎜Funktion höherer Ordnung startet die Ausführung: 'setTimeout()starts'🎜
  • 🎜Die Funktion höherer Ordnung schließt ihre Ausführung ab: 'setTimeout() abgeschlossen'🎜
  • 🎜Die Callback-Funktion wird nach 2 Sekunden ausgeführt: 'später( ) aufgerufen'🎜

🎜Beispiel für einen asynchronen Rückruf🎜

🎜Timer-Funktion ruft Rückruf asynchron auf:🎜rrreee🎜Der DOM-Ereignis-Listener ruft auch den Ereignishandler asynchron auf Funktion (Untertyp der Rückruffunktion): 🎜rrreee🎜🎜4. Asynchrone Rückruffunktion und asynchrone Funktion 🎜🎜🎜 Durch Hinzufügen des speziellen Schlüsselworts async vor der Funktionsdefinition wird eine asynchrone Funktion erstellt: 🎜
async function fetchUserNames() {
  const resp = await fetch('https://api.github.com/users?per_page=5');
  const users = await resp.json();
  const names = users.map(({ login }) => login);
  console.log(names);
}
Nach dem Login kopieren
Nach dem Login kopieren

fetchUserNames() 是异步的,因为它以 async 为前缀。函数  await fetch('https://api.github.com/users?per_page=5') 从 GitHub 上获取前5个用户 。然后从响应对象中提取 JSON 数据:await resp.json()

异步函数是 promise 之上的语法糖。当遇到表达式 await <promise>  (调用  fetch()  会返回一个promise)时,异步函数会暂停执行,直到 promise 被解决。

异步回调函数和异步函数是不同的两个术语。

异步回调函数由高阶函数以非阻塞方式执行。但是异步函数在等待 promise(await <promise>)解析时会暂停执行。

但是你可以把异步函数用作异步回调!

让我们把异步函数 fetch UserNames() 设为异步回调,只需单击按钮即可调用:

const button = document.getElementById('fetchUsersButton');

button.addEventListener('click', fetchUserNames);
Nach dem Login kopieren
Nach dem Login kopieren

总结

回调是一个可以作为参数传给另一个函数(高阶函数)执行的函数。

回调函数有两种:同步和异步。

  • 同步回调是阻塞的。

  • 异步回调是非阻塞的。

【相关推荐:javascript学习教程

Das obige ist der detaillierte Inhalt vonEingehende Analyse von Callback-Funktionen in JavaScript (synchron und asynchron). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So schreiben Sie eine Java-Callback-Funktion So schreiben Sie eine Java-Callback-Funktion Jan 09, 2024 pm 02:24 PM

Die Schreibmethoden der Java-Rückruffunktion sind: 1. Schnittstellenrückruf: Definieren Sie eine Schnittstelle, die eine Rückrufmethode enthält, verwenden Sie die Schnittstelle als Parameter, an dem der Rückruf ausgelöst werden muss, und rufen Sie die Rückrufmethode zum entsprechenden Zeitpunkt auf. Anonymer innerer Klassenrückruf: Sie können anonyme innere Klassen verwenden, um Rückruffunktionen zu implementieren, um die Erstellung zusätzlicher Implementierungsklassen zu vermeiden. 3. Lambda-Ausdrucksrückrufe In Java 8 und höher können Sie Lambda-Ausdrücke verwenden, um das Schreiben von Rückruffunktionen zu vereinfachen.

PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools Mar 16, 2024 pm 12:09 PM

PHP und Vue: eine perfekte Kombination von Front-End-Entwicklungstools In der heutigen Zeit der rasanten Entwicklung des Internets ist die Front-End-Entwicklung immer wichtiger geworden. Da Benutzer immer höhere Anforderungen an das Erlebnis von Websites und Anwendungen stellen, müssen Frontend-Entwickler effizientere und flexiblere Tools verwenden, um reaktionsfähige und interaktive Schnittstellen zu erstellen. Als zwei wichtige Technologien im Bereich der Front-End-Entwicklung können PHP und Vue.js in Kombination als perfekte Waffe bezeichnet werden. In diesem Artikel geht es um die Kombination von PHP und Vue sowie um detaillierte Codebeispiele, die den Lesern helfen sollen, diese beiden besser zu verstehen und anzuwenden

Häufig gestellte Fragen von Front-End-Interviewern Häufig gestellte Fragen von Front-End-Interviewern Mar 19, 2024 pm 02:24 PM

In Front-End-Entwicklungsinterviews decken häufige Fragen ein breites Themenspektrum ab, darunter HTML/CSS-Grundlagen, JavaScript-Grundlagen, Frameworks und Bibliotheken, Projekterfahrung, Algorithmen und Datenstrukturen, Leistungsoptimierung, domänenübergreifende Anfragen, Front-End-Engineering, Designmuster sowie neue Technologien und Trends. Interviewerfragen sollen die technischen Fähigkeiten, die Projekterfahrung und das Verständnis des Kandidaten für Branchentrends beurteilen. Daher sollten Kandidaten in diesen Bereichen umfassend vorbereitet sein, um ihre Fähigkeiten und Fachkenntnisse unter Beweis zu stellen.

Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Einfaches JavaScript-Tutorial: So erhalten Sie den HTTP-Statuscode Jan 05, 2024 pm 06:08 PM

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Ist Django Front-End oder Back-End? Hör zu! Ist Django Front-End oder Back-End? Hör zu! Jan 19, 2024 am 08:37 AM

Django ist ein in Python geschriebenes Webanwendungs-Framework, das Wert auf schnelle Entwicklung und saubere Methoden legt. Obwohl Django ein Web-Framework ist, müssen Sie zur Beantwortung der Frage, ob Django ein Front-End oder ein Back-End ist, ein tiefes Verständnis der Konzepte von Front-End und Back-End haben. Das Front-End bezieht sich auf die Schnittstelle, mit der Benutzer direkt interagieren, und das Back-End bezieht sich auf serverseitige Programme. Sie interagieren mit Daten über das HTTP-Protokoll. Wenn das Front-End und das Back-End getrennt sind, können die Front-End- und Back-End-Programme unabhängig voneinander entwickelt werden, um Geschäftslogik bzw. interaktive Effekte sowie den Datenaustausch zu implementieren.

Erkundung der Front-End-Technologie der Go-Sprache: eine neue Vision für die Front-End-Entwicklung Erkundung der Front-End-Technologie der Go-Sprache: eine neue Vision für die Front-End-Entwicklung Mar 28, 2024 pm 01:06 PM

Als schnelle und effiziente Programmiersprache erfreut sich Go im Bereich der Backend-Entwicklung großer Beliebtheit. Allerdings assoziieren nur wenige Menschen die Go-Sprache mit der Front-End-Entwicklung. Tatsächlich kann die Verwendung der Go-Sprache für die Front-End-Entwicklung nicht nur die Effizienz verbessern, sondern Entwicklern auch neue Horizonte eröffnen. In diesem Artikel wird die Möglichkeit der Verwendung der Go-Sprache für die Front-End-Entwicklung untersucht und spezifische Codebeispiele bereitgestellt, um den Lesern ein besseres Verständnis dieses Bereichs zu erleichtern. In der traditionellen Frontend-Entwicklung werden häufig JavaScript, HTML und CSS zum Erstellen von Benutzeroberflächen verwendet

Grundlegende Syntax und Anwendung von Callback-Funktionen in Java Grundlegende Syntax und Anwendung von Callback-Funktionen in Java Jan 30, 2024 am 08:12 AM

Einführung in das grundlegende Schreiben und Verwenden von Java-Rückruffunktionen: In der Java-Programmierung ist die Rückruffunktion ein gängiges Programmiermuster. Durch die Rückruffunktion kann eine Methode als Parameter an eine andere Methode übergeben werden, wodurch ein indirekter Aufruf der Methode erreicht wird. Die Verwendung von Rückruffunktionen ist in Szenarien wie der ereignisgesteuerten, asynchronen Programmierung und Schnittstellenimplementierung sehr verbreitet. In diesem Artikel wird das grundlegende Schreiben und Verwenden von Java-Rückruffunktionen vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Definition der Callback-Funktion Eine Callback-Funktion ist eine spezielle Funktion, die als Parameter verwendet werden kann

Django: Ein magisches Framework, das sowohl Front-End- als auch Back-End-Entwicklung bewältigen kann! Django: Ein magisches Framework, das sowohl Front-End- als auch Back-End-Entwicklung bewältigen kann! Jan 19, 2024 am 08:52 AM

Django: Ein magisches Framework, das sowohl Front-End- als auch Back-End-Entwicklung bewältigen kann! Django ist ein effizientes und skalierbares Webanwendungs-Framework. Es unterstützt mehrere Webentwicklungsmodelle, einschließlich MVC und MTV, und kann problemlos hochwertige Webanwendungen entwickeln. Django unterstützt nicht nur die Back-End-Entwicklung, sondern kann auch schnell Front-End-Schnittstellen erstellen und durch die Vorlagensprache eine flexible Ansichtsanzeige erreichen. Django kombiniert Front-End-Entwicklung und Back-End-Entwicklung zu einer nahtlosen Integration, sodass sich Entwickler nicht auf das Lernen spezialisieren müssen

See all articles