Maison > interface Web > js tutoriel > Comment gérer plusieurs problèmes de concurrence dans les compétences JavaScript_javascript

Comment gérer plusieurs problèmes de concurrence dans les compétences JavaScript_javascript

WBOY
Libérer: 2016-05-16 15:34:48
original
1514 Les gens l'ont consulté

Je rencontre souvent ce scénario lors de l'écriture de code : la page de chargement s'affiche lorsque la page est initialisée, plusieurs requêtes simultanées ajax sont lancées pour obtenir des données, et le chargement se termine au retour de chaque requête ajax.

Par exemple, une page pour passer une commande doit interroger des informations d'adresse communes, des informations sur le produit, des informations sur la ville... et ces requêtes sont asynchrones. On espère que l'utilisateur ne sera pas autorisé à fonctionner tant que toutes les données ne seront pas chargées. .

Un problème facile à rencontrer lors de la mise en œuvre de ce scénario est de savoir comment contrôler la simultanéité multiple ? Voici quelques solutions et idées :

Parallèle remplacé par série

Si la logique métier elle-même est série, mais que la méthode de requête fournie est asynchrone, vous pouvez envisager cette méthode.
Mais ce n’est évidemment pas le cas dans ce scénario. Cela réduit considérablement les performances de la page et prolonge la vitesse de chargement.

Rappel

Convient uniquement aux situations où le nombre de concurrences est faible. Plusieurs niveaux de rappels imbriqués réduiront considérablement la lisibilité du code

.
function async1(){
  //do sth...
}
function async2(){
  //do sth...
  async1();
}
async2();

Copier après la connexion

ajax est passé à la synchronisation

Définissez le paramètre async sur false dans jquery

$.ajax({
  url:"/jquery/test1.txt",
  async:false
});
Copier après la connexion

Définir le drapeau de fin

Une approche plus simple peut consister à configurer un compteur qui s'incrémente de 1 à chaque fois qu'une fonction asynchrone est terminée, ou à configurer un tableau et à mettre à jour le tableau à chaque fois qu'une fonction asynchrone est exécutée.

Nombre de rappels

var cnt = 0;
function async1(){
  //do sth...
  callback();
}
function async2(){
  //do sth...
  callback();
}
function callback(){
  cnt++;
  if(2==cnt) console.log('都已执行完毕');
}

Copier après la connexion

Boucle bloquée

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
while(2>cnt){}

Copier après la connexion

Boucle non bloquante

Il n'est pas recommandé de trop l'utiliser pour éviter d'affecter les performances

var cnt = 0;
function async1(){
  //do sth...
  cnt++;
}
function async2(){
  //do sth...
  cnt++;
}
var interval = setInterval(function(){
  if(2===cnt){
    console.log('已执行完成');
    clearInterval(interval)
  }
}

Copier après la connexion

Mise en œuvre d'un framework tiers

jquery

L'approche actuelle que j'utilise dans mon projet

var d1 = $.Deferred();
var d2 = $.Deferred();
function async1(){
  d1.resolve( "Fish" );
}
function async2(){
  d2.resolve( "Pizza" );
}
$.when( d1, d2 ).done(function ( v1, v2 ) {
  console.log( v1 + v2 + '已完成');
});
Copier après la connexion

Le contenu ci-dessus est les connaissances pertinentes introduites par l'éditeur sur la façon de gérer plusieurs problèmes de concurrence en JavaScript. J'espère qu'il vous sera utile.

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal