2016-11-29 2 views
0

So schreiben Sie den folgenden Schleifensatz ordnungsgemäß in Node.Js, ohne die Ereignisschleife zu blockieren oder ohne einen Speicherfehler zu verursachen.Schreiben geschachtelter nicht blockierender Schleifen in node.js

Was ich bisher versucht umfasst

  • Kombinationen von setImmediate()/setInterval()
  • Das Async Modul see my code here
  • Thread_a_gogo (dieses Modul wird nicht mehr gepflegt)

Der Code.

for(var i = 0; i < 2000; i++) 
    for(var j = 0; i < 2000; j++) 
     for(var k = 0; k < 2000; k++) 
      console.log(i + ":" + j + ":" + k); 

erstellt auch eine JSFiddle um here

+1

Ich glaube nicht, dass die Ereignisschleife ist, was Sie für Berechnungen verwenden möchten. Sein Zweck ist die Verarbeitung von Async-IO. Ein neuer Prozess, der für Schleifen funktioniert, wäre besser. – tcooc

+0

Sie meinen, zum Beispiel child_process zu verwenden? –

+0

Ihr 'async.js'-Code sollte funktionieren, Sie müssen nur das asynchrone' setImmediate (cb) '(etc) verwenden, anstatt sofort' cb() 'aufzurufen. – Bergi

Antwort

1

Nicht wirklich sicher zu spielen, was Ihre Use-Case ist. Javascript blockiert, da es single threaded ist, es müsste die Schleife ausführen, bevor es zu etwas anderem geht.

Sie können beispielsweise einen Generator verwenden, um jede Iteration für ein Ereignis auszuführen.

function* ticker() { 
    for(let i = 0; i < 10; i++) 
    for(let j = 0; i < 10; j++) 
     for(let k = 0; k < 10; k++) 
      yield[i, j, k]; 
} 

const gen = ticker(); 

setInterval(() => console.log(gen.next().value), 500); 

console.log('I am at the end (called straight away)'); 
+2

Das hört nie auf. Sie müssen für '.next() .done' testen und wenn es' true' ist, löschen Sie das Intervall. – Bergi

1

Sie benötigen setImmediate/setTimeout/etc zu kombinieren. mit der async.js-Bibliothek. async.each ist nur für Orchestrierung, es stellt selbst keine Asynchronität bereit.

function getPerm(reducedWordList, callback) { 
    var sevenLtrWords = _.filter(reducedWordList, word => word.length == 7); 
    var fourLtrWords = _.filter(reducedWordList, word => word.length == 4); 

    async.each(sevenLtrWords, (i, cb) => { 
     async.each(sevenLtrWords, (j, cb) => { 
      async.each(fourLtrWords, (k, cb) => { 
       console.log(i + " " + j + " " + k); 
       setTimeout(cb, 0); 
      }, cb); 
     }, cb); 
    }, callback); 
} 
+0

Wenn ich das richtig verstehe, wird 'setTimeOut()' im obigen Code nur den innersten Async aktivieren, um die Ereignisschleife richtig anzukreuzen? –

+1

Es ist 'setTimeout' selbst, die die Ereignisschleife abhebt. Alle diese 'cb's bringen gerade ihre jeweilige Iteration voran, wenn sie aufgerufen werden, und wenn das Array-Ende erreicht ist, ruft sie stattdessen den nächsten äußeren Callback auf. – Bergi

Verwandte Themen