Heim  >  Artikel  >  Web-Frontend  >  So ermitteln Sie, ob die Ausführung während mehrerer asynchroner Prozesse in node.js abgeschlossen ist (ausführliches Tutorial)

So ermitteln Sie, ob die Ausführung während mehrerer asynchroner Prozesse in node.js abgeschlossen ist (ausführliches Tutorial)

亚连
亚连Original
2018-06-21 17:17:571509Durchsuche

In diesem Artikel werden hauptsächlich verschiedene Lösungen zur Beurteilung, ob die Ausführung von node.js in mehreren asynchronen Prozessen abgeschlossen ist, anhand von Beispielcodes vorgestellt, die für jedermanns Studium oder Arbeit eine sichere Referenz darstellen , Freunde in Not kommen und schauen unten vorbei.

Vorwort

Dieser Artikel führt Sie hauptsächlich in den relevanten Inhalt zur Beurteilung ein, ob die Ausführung in mehreren asynchronen Prozessen von node.js abgeschlossen ist. Es könnte so sein. Wenn Sie es nicht sehr gut verstehen, werfen wir einen Blick auf die ausführliche Einführung.

Szenario:

Ich möchte eine große Menge an Netzwerkdaten anfordern, zum Beispiel möchte ich 1000 Ergebnisse erhalten, aber die Daten Die Verarbeitungsgeschwindigkeit ist langsam und es gibt eine Zeitüberschreitung. Das Risiko kann in 10 Verarbeitungszeiten unterteilt werden, wobei jedes Mal 100 Elemente verarbeitet werden, nachdem sie abgeschlossen sind.

Ein solches Anwendungsszenario lässt sich wie folgt abwickeln:

Option 1: Ermitteln Sie den gewünschten Dateneintrag

// 模拟网络请求
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);
  }
 });
 }
}

verwendet arr.length, um die laufenden Ergebnisse zu beurteilen. Wenn arr.length beispielsweise nicht unseren Erwartungen entspricht, weil aufgrund einer Netzwerkübertragungs- oder Verarbeitungsausnahme eine Ausnahme fehlt, können wir keine weiteren Schritte durchführen Verarbeitung. Diese Verarbeitungsmethode weist eine starke Geschäftskopplung auf; sie ist nicht universell.

Option 2: Bestimmen Sie die Anzahl der asynchronen Prozessausführungen

// 方案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);
  }
 });
 }
}

Die Beurteilungsbedingungen von Option 2, der taskWatcher fungiert hier als Beobachter die asynchrone Aufgabenausführung, Es hängt nur von der Anzahl der Aufrufe der asynchronen Prozedur ab und hat nichts mit anderen Verarbeitungsverfahren zu tun. Gibt es noch andere Optionen?

Option 3: Promise.all()

Promise.all(iterable) Methode gibt ein Promise zurück, das verwendet wird Im obigen Beispiel werden alle Versprechen im iterierbaren Objekt aufgelöst, nachdem sie aufgelöst wurden, oder sie werden abgelehnt, nachdem ein Versprechen abgelehnt wurde.

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);
 });
}

Diese Methode ist vielseitiger und kann auf diese Weise gelöst werden, wenn die asynchronen Aufgabentypen unterschiedlich sind. Allerdings sollte auf den Umgang mit Ausschuss geachtet werden. Vermeiden Sie dessen Auswirkungen auf die Endverarbeitung.

Option 4: EventProxy

EventProxy wurde von Pu Ling geschrieben, 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 basiert auf dem Ereignisabonnement-/Veröffentlichungsmodell, das mehrere Ereignisse abhören kann, und der Rückruf speichert ein Array von Datenergebnissen mehrerer asynchroner Aufgaben. Darüber hinaus unterstützt EventProxy auch das Abhören mehrerer verschiedener Ereignisse. und Verarbeitung.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

So konfigurieren Sie den Schnittstellen-Proxy mit vue-cli

So verwenden Sie das Formulardatenformat zum Übertragen von Dateien in NodeJs

So implementieren Sie das verzögerte Laden von Bildern im WeChat-Miniprogramm

So verwenden Sie js, um einen Fokusbildeffekt zu erzielen

Das obige ist der detaillierte Inhalt vonSo ermitteln Sie, ob die Ausführung während mehrerer asynchroner Prozesse in node.js abgeschlossen ist (ausführliches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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