Maison >interface Web >js tutoriel >En savoir plus sur les fonctions de rappel en JavaScript

En savoir plus sur les fonctions de rappel en JavaScript

青灯夜游
青灯夜游avant
2021-01-15 10:40:522551parcourir

En savoir plus sur les fonctions de rappel en JavaScript

Recommandations associées : "Tutoriel vidéo javascript"

La fonction de rappel est l'un des concepts que tout programmeur front-end devrait connaître. Les rappels peuvent être utilisés dans les tableaux, les fonctions de minuterie, les promesses et la gestion des événements.

Cet article expliquera le concept des fonctions de rappel et vous aidera à distinguer deux types de rappels : synchrones et asynchrones.

Fonction de rappel

Écrivez d'abord une fonction pour saluer les gens.

Créez simplement une fonction name qui accepte les paramètres greet(name). Cette fonction devrait renvoyer le message de bienvenue :

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

greet('Cristina'); // => 'Hello, Cristina!'

Et si vous saluez beaucoup de personnes ? Vous pouvez utiliser la méthode spéciale de tableau array.map() pour obtenir :

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

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

persons.map(greet) Obtenez tous les éléments du tableau persons et appelez la fonction greet() avec chaque élément comme paramètre d'appel : `greet('Cristina') , greet('Ana').

Fait intéressant, la méthode persons.map(greet) peut accepter les fonctions greet() comme paramètres. De cette façon, greet() devient la fonction de rappel .

persons.map(greet) est une fonction qui prend une autre fonction comme paramètre, elle est donc appelée une fonction d'ordre supérieur. La

Fonction de rappel est utilisée comme paramètre de la fonction d'ordre supérieur, et la fonction d'ordre supérieur effectue des opérations en appelant la fonction de rappel.

L'important est que la fonction d'ordre supérieur soit chargée d'appeler le rappel et de lui fournir les paramètres corrects.

Dans l'exemple précédent, la fonction d'ordre supérieur persons.map(greet) est chargée d'appeler la fonction greet() et de prendre tous les éléments du tableau 'Cristina' et Ana ' comme paramètres respectivement.

Cela fournit une règle simple pour identifier les rappels. Si vous définissez une fonction et la fournissez comme paramètre à une autre fonction, cela crée un rappel.

Vous pouvez écrire vos propres fonctions d'ordre supérieur à l'aide de rappels. Voici la version équivalente de la méthode 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!']

map(array, callback) est une fonction d'ordre supérieur car elle prend une fonction de rappel comme argument et appelle ensuite cette fonction de rappel dans son corps : callback(item) .

Notez que les fonctions régulières (définies avec le mot-clé function) ou les fonctions fléchées (définies avec la flèche épaisse =>) peuvent également être utilisées comme rappels.

Rappel synchrone

Les rappels peuvent être appelés de deux manières : les rappels synchrones et asynchrones.

Les rappels synchrones sont "bloquants" : la fonction d'ordre supérieur ne continue pas son exécution tant que la fonction de rappel n'est pas terminée.

Par exemple, appelez les fonctions map() et 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'

greet() est un rappel synchrone.

Étapes pour synchroniser les rappels :

  • Exécution de la fonction d'ordre supérieur : 'map() starts'

  • Exécution de la fonction de rappel : 'greet() called'

  • . Enfin, la fonction d'ordre supérieur termine son propre processus d'exécution : 'map() completed'

Exemple de rappel synchrone

De nombreuses méthodes de type JavaScript natif utilisent des rappels synchrones.

La méthode la plus couramment utilisée est le tableau, par exemple :

, 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

méthode de type chaîne Accepte également les rappels exécutés de manière synchrone : 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'

Rappels asynchrones

Les rappels asynchrones sont "non bloquants" : les fonctions d'ordre supérieur n'ont pas besoin d'attendre la fin du rappel pour terminer leur exécution. Les fonctions d'ordre supérieur garantissent que les rappels sont exécutés ultérieurement sur des événements spécifiques.

Dans l'exemple suivant, l'exécution de la fonction

est retardée de 2 secondes : later()

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)

est un rappel asynchrone car later() a commencé et terminé l'exécution, mais setTimeout(later,2000) Exécuter après 2 secondes. later()

Étapes pour appeler le rappel de manière asynchrone :

  • La fonction d'ordre supérieur commence à s'exécuter :

    'setTimeout()starts'

  • Fonction d'ordre supérieur termine son exécution Exécution :

    'setTimeout() completed'

  • La fonction de rappel est exécutée au bout de 2 secondes :

    'later() called'

Exemple de rappel asynchrone

La fonction timer appelle le rappel de manière asynchrone :

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!'

L'écouteur d'événements DOM appelle également la fonction de traitement d'événements (un sous-type de la fonction de rappel) de manière asynchrone :

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

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

4. fonction et fonction asynchrone

Mettre le mot-clé spécial

avant la définition de la fonction créera une fonction asynchrone : 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);
}

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

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

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

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

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

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

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

button.addEventListener('click', fetchUserNames);

总结

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

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

同步回调是阻塞的。

异步回调是非阻塞的。

最后考考你:setTimeout(callback,0) 执行 callback 时是同步还是异步的?

更多编程相关知识,请访问:编程视频!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer