Maison > interface Web > js tutoriel > Comment planifier des tâches d'arrière-plan en javascript

Comment planifier des tâches d'arrière-plan en javascript

William Shakespeare
Libérer: 2025-02-18 09:04:11
original
274 Les gens l'ont consulté

How to Schedule Background Tasks in JavaScript

Points de base

  • JavaScript est un langage de blocage qui ne peut effectuer qu'une seule tâche à la fois, ce qui peut faire en sorte que les scripts de longue date rendent le navigateur qui ne répond pas. Cependant, des tâches de fond moins importantes peuvent être planifiées pour s'exécuter sans affecter directement l'expérience utilisateur.
  • requestIdleCallback est une API qui permet de planifier des tâches inutiles lorsque le navigateur est inactif, similaire à la fonctionnalité de requestAnimationFrame. Il peut être utilisé avec l'option de délai d'expiration pour s'assurer que les tâches fonctionnent dans une plage de temps définie, même si le navigateur n'est pas inactif.
  • requestIdleCallback est une fonctionnalité expérimentale avec un support de navigateur limité et ne convient pas aux tâches qui effectuent un temps imprévisible ou pour résoudre les tâches de promesse. Pour les navigateurs ou tâches non pris en charge qui nécessitent un accès direct au DOM, des alternatives telles que les travailleurs Web ou setTimeout peuvent être utilisées.

Si vous oubliez tout le reste en javascript, rappelez-vous toujours ceci: il bloque . Imaginez un assistant de traitement magique faisant fonctionner votre navigateur. Qu'il s'agisse de rendre HTML, de réponse aux commandes de menu, de dessin à l'écran, de manipulation de clics de souris ou d'exécution des fonctions JavaScript, tout cela est géré par un seul sprite. Comme la plupart d'entre nous, les elfes ne peuvent faire qu'une seule chose à la fois. Si nous lançons beaucoup de tâches sur les elfes, ils sont ajoutés à une grande liste de tâches et traités dans l'ordre. Tout le reste s'arrête lorsque le sprite rencontre une balise de script ou doit exécuter une fonction JavaScript. Le code (si nécessaire) sera téléchargé et exécuté immédiatement avant que d'autres événements ou le rendu ne soient traités. Ceci est nécessaire car votre script peut tout faire: charger plus de code, supprimer chaque élément DOM, rediriger vers une autre URL, etc. Même avec deux sprites ou plus, d'autres sprites doivent cesser de fonctionner lorsque le premier sprite traite votre code. C'est un blocage. C'est pourquoi les scripts de longue date ne réagissent pas le navigateur. Vous voulez généralement que JavaScript s'exécute dès que possible, car le code initialise les widgets et les gestionnaires d'événements. Cependant, il existe des tâches backend moins importantes qui n'affecteront pas directement l'expérience utilisateur, telles que:

  • Données d'analyse d'enregistrement
  • Envoyez des données aux réseaux sociaux (ou ajoutez 57 boutons "partager")
  • Préfectez le contenu
  • Prétraitement ou pré-rendu HTML

Ce ne sont pas des tâches critiques, mais pour garder la page réactive, elles ne doivent pas s'exécuter lorsque l'utilisateur défile ou interagit avec le contenu. Une option consiste à utiliser des travailleurs Web, qui peuvent exécuter le code simultanément dans un thread séparé. Il s'agit d'un excellent choix pour la prélecture et le traitement, mais vous n'autorisez pas l'accès direct ou la mise à jour du DOM. Vous pouvez éviter cela dans vos propres scripts, mais vous ne pouvez pas garantir que des scripts tiers tels que Google Analytics n'en auront jamais besoin. Une autre possibilité est setTimeout, par exemple setTimeout(doSomething, 1);. Le navigateur exécutera la fonction doSomething() une fois les autres tâches immédiatement exécutées. En fait, il est placé en bas de la liste de tâches. Malheureusement, la fonction est appelée quelles que soient les exigences de traitement.

requestIdleCallback

requestIdleCallback est une nouvelle API conçue pour planifier des tâches backend non essentielles pendant les moments de la respiration du navigateur. Il vous rappelle requestAnimationFrame, qui appelle une fonction pour mettre à jour l'animation avant la prochaine repeinte. Vous pouvez en savoir plus sur requestAnimationFrame ici: Animation simple à l'aide de demandeanimationframe

Nous pouvons vérifier s'il le prend en charge comme celui-ci requestIdleCallback:

if ('requestIdleCallback' in window) {
  // requestIdleCallback 受支持
  requestIdleCallback(backgroundTask);
} else {
  // 不支持 - 执行其他操作
  setTimeout(backgroundTask1, 1);
  setTimeout(backgroundTask2, 1);
  setTimeout(backgroundTask3, 1);
}
Copier après la connexion
Copier après la connexion

Vous pouvez également spécifier des paramètres d'objet d'option en utilisant le délai d'attente (en millisecondes), par exemple:

requestIdleCallback(backgroundTask, { timeout: 3000 });
Copier après la connexion
Copier après la connexion

Cela garantit que votre fonction est appelée dans les trois premières secondes, que le navigateur soit inactif ou non. requestIdleCallback Appelez votre fonction une seule fois et transmettez un objet de date limite avec les propriétés suivantes:

  • didTimeout - Définir sur true
  • si le déclencheur de délai d'attente facultatif est défini sur true
  • timeRemaining()
  • - Fonction qui renvoie les millisecondes restantes de la tâche exécutable

timeRemaining() requestIdleCallback Votre tâche ne se verra pas attribuer au plus de 50 millisecondes de temps d'exécution. Il n'arrête pas les tâches qui dépassent cette limite, mais il est préférable d'appeler à nouveau

pour planifier un traitement ultérieur. Créons un exemple simple qui effectue plusieurs tâches dans l'ordre. Les tâches sont stockées dans un tableau comme références de fonction:
// 要运行的函数数组
var task = [
  background1,
  background2,
  background3
];

if ('requestIdleCallback' in window) {
  // requestIdleCallback 受支持
  requestIdleCallback(backgroundTask);
} else {
  // 不支持 - 尽快运行所有任务
  while (task.length) {
    setTimeout(task.shift(), 1);
  }
}

// requestIdleCallback 回调函数
function backgroundTask(deadline) {
  // 如果可能,运行下一个任务
  while (deadline.timeRemaining() > 0 && task.length > 0) {
    task.shift()();
  }

  // 如果需要,安排进一步的任务
  if (task.length > 0) {
    requestIdleCallback(backgroundTask);
  }
}
Copier après la connexion
Copier après la connexion

requestIdleCallback Actions qui ne devraient pas être effectuées dans

?

requestIdleCallback Comme Paul Lewis le souligne dans son article de blog sur ce sujet, le travail que vous effectuez dans requestAnimationFrame devrait être divisé en petits morceaux. Il ne fonctionne pas pour rien avec un temps d'exécution imprévisible (comme l'exploitation du DOM, ce qui est mieux fait en utilisant le rappel

). Vous devez également faire attention à résoudre (ou rejeter) la promesse, car le rappel sera exécuté immédiatement une fois le rappel inactif terminé, même s'il ne reste plus de temps. <🎜>

requestIdleCallback Prise en charge du navigateur

requestIdleCallback est une caractéristique expérimentale, et les spécifications changent toujours, alors ne soyez pas surpris lorsque vous rencontrez des modifications de l'API. Il est pris en charge dans Chrome 47… Ceci devrait être disponible d'ici la fin de 2015. Opera devrait également obtenir cette fonctionnalité bientôt. Microsoft et Mozilla envisagent d'utiliser l'API, et cela semble prometteur. Apple n'a aucune nouvelle comme d'habitude. Si vous voulez l'essayer aujourd'hui, la meilleure façon est d'utiliser Chrome Canary (une version mise à jour de Chrome qui n'est pas aussi bonne que la première, mais a les dernières fonctionnalités intéressantes). Paul Lewis (mentionné ci-dessus) crée une cale simple requestIdleCallback. Cela met en œuvre la description de l'API, mais ce n'est pas un polyfill qui peut simuler le comportement de détection d'inactivité du navigateur. Il utilise la méthode d'utilisation de setTimeout comme l'exemple ci-dessus, mais c'est une bonne option si vous souhaitez utiliser l'API sans détection d'objets et charge de code. Bien qu'il y ait un support limité aujourd'hui, requestIdleCallback peut être un outil intéressant pour vous aider à maximiser vos performances Web. Mais que pensez-vous? J'adorerais entendre vos réflexions dans la section des commentaires ci-dessous.

FAQ sur la planification des tâches backend en javascript (FAQ)

Quelle est l'API de la tâche d'arrière-plan en javascript?

Tâches d'arrière-plan Dans JavaScript L'API est un outil puissant qui permet aux développeurs de planifier des tâches en arrière-plan, même si le thread principal est inactif. Cette API convient particulièrement aux tâches qui nécessitent beaucoup de demandes de calcul ou de réseau, car il permet de réaliser ces tâches sans bloquer le thread principal et mener potentiellement à une mauvaise expérience utilisateur. L'API de tâche backend fait partie de la plus grande API Web fournie par les navigateurs modernes, offrant une manière plus efficace et axée sur les performances de gérer les tâches backend que les méthodes traditionnelles setTimeout ou setInterval.

En quoi l'API de la tâche d'arrière-plan

est-elle différente de setTimeout et setInterval?

Les fonctions

setTimeout et setInterval sont des méthodes traditionnelles en JavaScript qui sont utilisées pour planifier des tâches pour s'exécuter après un retard spécifique ou à intervalles réguliers. Cependant, ces approches ont certaines limites, en particulier en termes de performances. Ils fonctionnent sur le fil principal, ce qui signifie que s'ils prennent trop de temps à terminer, ils peuvent bloquer d'autres tâches et peuvent conduire à une mauvaise expérience utilisateur. D'un autre côté, l'API de la tâche d'arrière-plan exécute des tâches en arrière-plan, séparées du fil principal. Cela signifie qu'il peut gérer des tâches plus intensives sans affecter les performances du fil principal.

Puis-je utiliser l'API de la tâche d'arrière-plan dans tous les navigateurs?

L'API de tâche backend est un ajout relativement nouveau à l'API Web fournie par les navigateurs modernes, il peut donc ne pas être pris en charge dans tous les navigateurs. Lorsque vous prévoyez d'utiliser une API dans votre projet, il est toujours préférable de vérifier le niveau de support actuel de l'API que vous prévoyez d'utiliser. Des sites Web comme puis-je utiliser fournissent les dernières informations sur les niveaux de support de diverses API dans différents navigateurs.

Comment utiliser l'API de la tâche d'arrière-plan pour planifier des tâches en arrière-plan?

Pour utiliser l'API de la tâche d'arrière-plan pour planifier les tâches, vous pouvez utiliser la méthode requestIdleCallback. Cette méthode prend la fonction de rappel comme son premier paramètre, qui sera exécuté lorsque le navigateur est inactif. Voici un exemple de base:

if ('requestIdleCallback' in window) {
  // requestIdleCallback 受支持
  requestIdleCallback(backgroundTask);
} else {
  // 不支持 - 执行其他操作
  setTimeout(backgroundTask1, 1);
  setTimeout(backgroundTask2, 1);
  setTimeout(backgroundTask3, 1);
}
Copier après la connexion
Copier après la connexion

Comment annuler les tâches d'arrière-plan planifiées?

Si vous devez annuler les tâches d'arrière-plan planifiées à l'aide de la méthode requestIdleCallback, vous pouvez utiliser la méthode cancelIdleCallback. Cette méthode prend l'ID renvoyé par requestIdleCallback comme paramètre. Voici un exemple:

requestIdleCallback(backgroundTask, { timeout: 3000 });
Copier après la connexion
Copier après la connexion
À quoi sert l'option Timeout dans

requestIdleCallback?

L'option de délai d'expiration dans

requestIdleCallback spécifie le temps maximum (en millisecondes), le navigateur doit attendre avant d'exécuter le rappel, même s'il n'est pas inactif. Ceci est utile si vos tâches d'arrière-plan doivent fonctionner dans un délai spécifique.

Comment gérer les erreurs dans les tâches de fond?

Les erreurs de traitement des tâches d'arrière-plan planifiées à l'aide de l'API de la tâche d'arrière-plan sont similaires aux erreurs de gestion dans tout autre code JavaScript. Vous pouvez utiliser le bloc Try / Catch pour attraper les erreurs qui se produisent lors de l'exécution de la tâche. Voici un exemple:

// 要运行的函数数组
var task = [
  background1,
  background2,
  background3
];

if ('requestIdleCallback' in window) {
  // requestIdleCallback 受支持
  requestIdleCallback(backgroundTask);
} else {
  // 不支持 - 尽快运行所有任务
  while (task.length) {
    setTimeout(task.shift(), 1);
  }
}

// requestIdleCallback 回调函数
function backgroundTask(deadline) {
  // 如果可能,运行下一个任务
  while (deadline.timeRemaining() > 0 && task.length > 0) {
    task.shift()();
  }

  // 如果需要,安排进一步的任务
  if (task.length > 0) {
    requestIdleCallback(backgroundTask);
  }
}
Copier après la connexion
Copier après la connexion

Puis-je utiliser l'API de la tâche d'arrière-plan dans Node.js?

L'API de tâche backend fait partie de l'API Web fournie par les navigateurs modernes, il n'est donc pas disponible dans Node.js par défaut. Cependant, il existe d'autres moyens d'exécuter des tâches d'arrière-plan dans Node.js, comme l'utilisation de threads ouvriers ou de processus enfants.

Puis-je utiliser l'API de la tâche d'arrière-plan avec Promise ou Async / Await?

L'API de la tâche d'arrière-plan ne renvoie pas de promesse, il ne peut donc pas être utilisé directement avec Async / Await. Cependant, si vous devez l'utiliser dans un contexte asynchrone, vous pouvez envelopper la méthode requestIdleCallback dans une promesse. Voici un exemple:

window.requestIdleCallback(() => {
  // 您的后台任务在此处
});
Copier après la connexion

Quels sont les cas d'utilisation de l'API de la tâche backend?

Les tâches d'arrière-plan L'API est utile pour toute tâche qui nécessite beaucoup de demandes de calcul ou de réseau, car elle permet d'exécuter ces tâches sans bloquer le thread principal. Certains exemples de cas d'utilisation peuvent inclure la récupération et le traitement des données de l'API, la réalisation de calculs complexes ou la mise à jour de l'interface utilisateur en fonction des interactions utilisateur.

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal