2016-06-17 5 views
2

Ich versuche zu verstehen, wie kann synchrone Ereignisdemultiplexing eine Lösung für beschäftigtes Warten sein.Wie kann das synchrone Demultiplexen von Ereignissen eine Lösung für das viel zu lange Warten sein?

Angenommen, es gibt 3 IO-Operationen, und wir haben einen Code, der ständig durchläuft, um zu prüfen, ob einer der 3 Operationen Daten zum Lesen zur Verfügung hat.

arry = [event1 , event2 , event3] 

    while(arry is not empty) 
    { 

     for(i = 0 ; i <= 2 ; i++) 
     { 
      if(arry[i] has something to read) 
      { 
       read data; 
      } 
      else 
      { 
       continue to next i; 
      } 

      if(arry[i] read has finished){ 
       remove i from arry 
      } 
     } 
    } 

Above Pseudo-Code hat eine busy waiting.

Jetzt im synchronen Ereignis Demultiplexing oder um Reaktormuster zu sagen, ist ein Ereignis Listener da, um auf ein Ereignis zu reagieren, wie es auftritt. Aber wie kann ein Ereignis-Listener das tun, ohne zu warten?

+0

Ich muss zugeben, ich habe noch nie von „* synchrones Ereignis Demultiplexen *“ zu hören. Können Sie auf einige Ressourcen verweisen, die es beschreiben, oder vielleicht einen Beispiel- (Pseudo-) Code in Ihre Frage einfügen? – Bergi

+0

Sie führen nichts synchron zu JavaScript-Ereignissen durch. Aber das bedeutet nicht, dass das Reaktormuster auch nicht asynchron arbeiten kann - anstatt zu warten - zwischen den Ereignissen zu warten, planen Sie einfach Ihren Schleifencode bei jedem der erwarteten Ereignisse ein. – Bergi

Antwort

0

So funktioniert es in JS nicht.

Wenn Sie eine Anfrage stellen, die wahrscheinlich eine asynchrone Benachrichtigung auslöst, müssen Sie einen Rückruf bereitstellen, der mit dem Anfrageergebnis als Parameter aufgerufen wird.

Ihr Pseudo-Code eher aussehen würde:

// request completion callback 
function handle_request_notification (request status and associated data) 
{ 
    store request data wherever you like 
    if all requests are complete (without error), do what you want to do 
    (now that you have a complete set of data) 
} 

// issuing requests 
do_request (whatever1, handle_request_notification) 
do_request (whatever2, handle_request_notification) 
do_request (whatever3, handle_request_notification) 

Also im Grunde ist es die Bibliothek, die die asynchronen Anforderungen verarbeitet, die das Bit-Code benötigt werden aktiviert, wenn es tatsächlich etwas (oder die Anforderung fehlgeschlagen zu lesen).

Jede spezifische Bibliothek hat ihren eigenen Weg dies zu tun.

Sie können einen Blick auf Ajax für einen Anfang werfen, das ist wahrscheinlich die Mutter aller JS asynchronen Bibliotheken.

Oder wenn Sie etwas einfacher, die Grundlagen lernen möchten, verwenden Sie einfach einen Timer :)

Verwandte Themen