Maison  >  Article  >  interface Web  >  Comment déterminer si l'exécution est terminée lors de plusieurs processus asynchrones dans node.js (tutoriel détaillé)

Comment déterminer si l'exécution est terminée lors de plusieurs processus asynchrones dans node.js (tutoriel détaillé)

亚连
亚连original
2018-06-21 17:17:571539parcourir

Cet article vous présente principalement plusieurs solutions pour juger si l'exécution est terminée dans plusieurs processus asynchrones de node.js. L'article le présente de manière très détaillée à travers un exemple de code, qui a une certaine référence pour l'étude ou le travail de chacun. amis dans le besoin venez jeter un oeil ci-dessous.

Avant-propos

Cet article vous présente principalement le contenu pertinent pour juger si l'exécution est terminée dans plusieurs processus asynchrones de node.js. C'est peut-être comme ça. Si vous ne le comprenez pas très bien, jetons un œil à l'introduction détaillée.

Scénario :

Je souhaite demander une grande quantité de données réseau, par exemple, je souhaite obtenir 1000 résultats, mais les données la vitesse de traitement est lente et il y a un délai d'attente. Le risque peut être divisé en 10 délais de traitement, avec 100 éléments traités à chaque fois ; toutes les demandes seront traitées uniformément une fois terminées.

Un tel scénario d'application peut être traité comme suit :

Option 1 : Déterminer la saisie de données demandée

// 模拟网络请求
function fetch(url, callback) {
 setTimeout(function (){
 callback(null, {
  subjects: [{
   data: Math.round(Math.random() * 100)
  }]
  });
 }, 2000);
}
// 实现方案1
function multiTask_1 () {
 var arr = [];
 var baseUrl = 'https://api.douban.com/v2/movie/top250';
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  // 调用完成后统一处理
  if (arr.length === 10) {
   console.log(arr);
  }
 });
 }
}

utilisera arr.length pour juger les résultats en cours d'exécution. Si arr.length n'est pas ce à quoi nous nous attendons, par exemple s'il en manque un en raison d'une transmission réseau ou d'une exception de traitement, nous ne pourrons pas le faire. effectuer un traitement ultérieur. Cette méthode de traitement présente un fort couplage commercial ; elle n’est pas universelle.

Option 2 : Déterminer le nombre d'exécutions de processus asynchrones

// 方案2
function multiTask_2 () {
 var taskWatcher = 0;
 var arr = [];
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskWatcher++;
 var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
 fetch(url, function(error, res) {
  var data = res.subjects;
  arr = arr.concat(data);
  taskWatcher--;
  if (taskWatcher === 0) {
   console.log(arr);
  }
 });
 }
}

La condition de jugement de l'option 2, le taskWatcher sert ici de Statut d'exécution des tâches asynchrones Les observateurs sont uniquement liés au nombre d'appels au processus asynchrone et n'ont rien à voir avec les autres processus. Existe-t-il d'autres options ?

Option 3 : Promise.all()

Promise.all(iterable) renvoie une promesse, qui sera utilisée dans ce qui précède, toutes les promesses de l'objet itérable sont résolues après leur résolution, ou elles sont rejetées après le rejet d'une promesse.

function multiTask_3 () {
 // var taskWatcher = 0;
 var taskStack = [];
 var arr = [];
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 taskStack.push(
  new Promise((resolve, reject) => {
  var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
  fetch(url, function(error, res) {
   var data = res.subjects;
   arr = arr.concat(data);
   resolve();
  });
  })
 );
 }
 Promise.all(taskStack).then(function () {
 console.log(arr);
 });
}

Cette méthode est plus polyvalente. Si les types de tâches asynchrones sont différents, elle peut également être résolue de cette manière. Il convient toutefois de prêter attention au traitement des rejets. Évitez son impact sur le traitement final.

Option 4 : EventProxy

EventProxy a été écrit par Pu Ling, https://github.com/JacksonTian/eventproxy

 var ep = new EventProxy();
 var arr = [];
 ep.after(&#39;fetchData&#39;, 10, function (list) {
 list.forEach(function(item){
  arr = arr.concat(item); 
 });
 console.log(arr);
 });
 var baseUrl = &#39;https://api.douban.com/v2/movie/top250&#39;;
 for (var start = 0; start < 10; start++) {
 var url = baseUrl + &#39;?start=&#39; + start + "&count=1";
  fetch(url, function(error, res) {
  var data = res.subjects;
  ep.emit(&#39;fetchData&#39;, data);
 });
 }

EventProxy est basé sur le modèle d'abonnement/publication d'événements. La méthode after ici peut écouter plusieurs événements, et le rappel stocke un tableau de résultats de données de plusieurs tâches asynchrones. De plus, EventProxy prend également en charge plusieurs événements différents. Écoutez et traitez.

J'ai compilé ce qui précède pour vous, j'espère que cela vous sera utile à l'avenir.

Articles associés :

Comment configurer le proxy d'interface à l'aide de vue-cli

Comment utiliser le format de données de formulaire pour transférer des fichiers dans NodeJs

Comment implémenter le chargement paresseux d'images dans le mini programme WeChat

Comment utiliser js pour obtenir un effet d'image focus

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:
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