Heim >Web-Frontend >js-Tutorial >Eine kurze Diskussion darüber, wie man eine asynchrone Aufgabenwarteschlange mithilfe der JS-Blockierungsmethode implementiert?

Eine kurze Diskussion darüber, wie man eine asynchrone Aufgabenwarteschlange mithilfe der JS-Blockierungsmethode implementiert?

青灯夜游
青灯夜游nach vorne
2021-08-23 11:17:302135Durchsuche

Wie implementiert man eine asynchrone Aufgabenwarteschlange mit JavaScript und verarbeitet alle Aufgaben in der Warteschlange der Reihe nach? In diesem Artikel erfahren Sie, wie Sie eine asynchrone Aufgabenwarteschlange mithilfe der JavaScript-Blockierungsmethode implementieren.

Eine kurze Diskussion darüber, wie man eine asynchrone Aufgabenwarteschlange mithilfe der JS-Blockierungsmethode implementiert?

Frage

Es besteht die Anforderung, eine asynchrone Aufgabenwarteschlange zu implementieren und alle Aufgaben in der Warteschlange nacheinander wie folgt zu verarbeiten:

  • Asynchrone Aufgaben zu zufälligen Zeiten zur Warteschlange hinzufügen

  • Warteschlange Die Aufgaben werden nacheinander gemäß der First-In-First-Out-Regel ausgeführt. Die Aufgaben sind asynchrone Anforderungen. Warten Sie, bis eine Ausführung abgeschlossen ist, bevor Sie die nächste ausführen. Diese Anforderung ist einfach zu implementieren Verwenden von BlockingQueue in der Java-Sprache, aber JavaScript verfügt nicht über einen Sperrmechanismus. Dies ist nicht so einfach zu implementieren.

  • Option 1

  • Man kann sich leicht vorstellen, das Schema „synchrones Nichtblockieren“ zu verwenden, um in bestimmten Abständen zu überprüfen, ob sich Aufgaben in der Warteschlange befinden, und wenn es Aufgaben gibt, nehmen Sie die erste zur Verarbeitung heraus . Das Erkennungsintervall beträgt hier 500 Millisekunden und setTimeout wird zur Simulation asynchroner Anforderungen verwendet.
<body>
  <button onclick="clickMe()">点我</button>
</body>
let queue = []
let index = 0
function clickMe() {
  queue.push({name: &#39;click&#39;, index: index++})
}

run()
async function run() {
  while (true) {
    if (queue.length > 0) {
      let obj = queue.shift()
      let res = await request(obj.index)
      console.log(&#39;已处理事件&#39; + res)
    } else {
      await wait(500)
      console.log(&#39;----- 队列空闲中 -----&#39;)
    }
  }
}
// 通过setTimeout模拟异步请求
function request(index) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      resolve(index)
    }, 1000)
  })
}
function wait(time) {
  return new Promise(function (resolve) {
    setTimeout(() => {
      resolve()
    }, time)
  })
}

Bei dieser Lösung gibt es jedoch zwei Probleme.

Die Leerlaufwarteschlange wird immer noch in einer Schleife verarbeitet und verbraucht Ressourcen. Das Erkennungsintervall ist schwer zu erfassen. Wenn das Intervall zu lang ist, kann die Warteschlangenaufgabe nicht verarbeitet werden, und das Erkennungsintervall ist zu kurz, was verbraucht Ressourcen

Eine kurze Diskussion darüber, wie man eine asynchrone Aufgabenwarteschlange mithilfe der JS-Blockierungsmethode implementiert?Ist es wie BlockingQueue in Java? Wie wäre es mit einer Möglichkeit, zu blockieren, wenn die Warteschlange inaktiv ist und keine Ressourcen verbraucht?

Option 2
  • Hauptidee:
Fügen Sie asynchrone Anforderungen zur Warteschlange hinzu. Wenn die Anzahl der Aufgaben in der Warteschlange größer als 0 ist, beginnen Sie mit der Verarbeitung der Aufgaben in der Warteschlange.

Warten Sie, bis eine Aufgabe ausgeführt wird Die nächste Aufgabe wird ausgeführt

Nachdem alle Aufgaben in der Warteschlange verarbeitet wurden, wird der Ausführungsstatus als falsch markiert Erreichen Sie eine Funktion ähnlich der BlockingQueue von Java, und asynchrone Aufgaben werden nacheinander ausgeführt. Und die Warteschlange verbraucht keine Ressourcen, wenn sie inaktiv ist.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter:

Programmiervideos

! !

    Das obige ist der detaillierte Inhalt vonEine kurze Diskussion darüber, wie man eine asynchrone Aufgabenwarteschlange mithilfe der JS-Blockierungsmethode implementiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen