2010-11-26 20 views
5

Vor ein paar Minuten fragte ich nach Looping, siehe Asynchronous for cycle in JavaScript.Loop-Modul für Node.js

Diesmal ist meine Frage - Gibt es ein Modul für Node.js?

for (/* ... */) { 

    // Wait! I need to finish this async function 
    someFunction(param1, praram2, function(result) { 

    // Okay, continue 

    }) 

} 

alert("For cycle ended"); 
+0

Sie wollen also die Methode effektiv synchron aufrufen? – thejh

+0

@thejh Ja! Genau. –

Antwort

3

Ist es so schwer, das Zeug in ein Modul zu verschieben?

EDIT: Aktualisierte den Code.

function asyncLoop(iterations, func, callback) { 
    var index = 0; 
    var done = false; 
    var loop = { 
     next: function() { 
      if (done) { 
       return; 
      } 

      if (index < iterations) { 
       index++; 
       func(loop); 

      } else { 
       done = true; 
       callback(); 
      } 
     }, 

     iteration: function() { 
      return index - 1; 
     }, 

     break: function() { 
      done = true; 
      callback(); 
     } 
    }; 
    loop.next(); 
    return loop; 
} 

exports.asyncFor = asyncLoop; 

Und ein kleiner Test:

// test.js 
var asyncFor = require('./aloop').asyncFor; // './' import the module relative 

asyncFor(10, function(loop) {  
     console.log(loop.iteration()); 

     if (loop.iteration() === 5) { 
      return loop.break(); 
     } 
     loop.next(); 
    }, 
    function(){console.log('done')} 
); 

Erholung an Ihnen ist, ist es unmöglich, diese 100% generisch zu machen.

+0

Nein, ist es nicht. Ich wollte nur wissen, ob es etwas speziell für Node.js gibt. Wie auch immer, danke nochmal! –

+0

Ich kenne kein solches Modul, Sie müssen Ihr eigenes für solche generischen Funktionen schreiben, normalerweise verwenden Sie einen völlig anderen Ansatz, um die Notwendigkeit solcher "async for loops" insgesamt zu vermeiden. Aber die Lösungen unterscheiden sich stark abhängig von der Art des Problems. –

+0

Okay, danke für die Klarstellung. –

1

Ja, Sie können Async.js verwenden.

Async ist ein Programm-Modul, das bietet geradlinig, leistungsstarke Funktionen für mit asynchronem JavaScript arbeiten. Obwohl ursprünglich für die Verwendung mit node.js entwickelt wurde, kann es auch direkt im Browser verwendet werden.

+1

Hat einen kurzen Blick darauf geworfen, aber was sie machen will, kann in 'async.js' nicht genau reproduziert werden. Sie möchte blockieren, bis der Rückruf beendet ist und das für X mal. Die Warteschlange würde sich zwar nahe kommen, aber es müssten einige Änderungen an dem Code vorgenommen werden, den sie gerade hat. Auch sie hat einen weiteren Rückruf in ihrer Funktion, was es wiederum etwas komplizierter macht. –