2016-09-20 4 views
0

Ich habe diese Funktion. Im Grunde sucht es Daten von der Datenbank und tut etwas damit. In dieser Demo erhöht es nur Zähler.Verzögerung hinzufügen zu ('Daten') Ausführung in Node.js

exports.fullThreads = function(){ 
    return new Promise((resolve, reject) => { 
    MongoClient.connect(mongoUrl, (err, db) => { 
     var fullThreads = db.collection('tmp_fullThreads'), 
      threadPages = db.collection('tmp_threadPages').find(); 

     var counter = 0; 

     threadPages.on('data', (doc) => { 
     setTimeout(function(){ 
      counter++; 
     }, 200) 
     }); 

     threadPages.on('end',() => { 
     console.log('end'); 
     console.log(counter); 
     }); 

    });//connect 
    });//promise 
}//fullthreads 

In diesem Beispiel erwartete ich, dass es für Daten nennen würde, warten 200ms, und dann Zähler erhöhen. Sobald es das Ende erreicht, würde es enden. Es ist jedoch anders. on('end') heißt vor on('data') eigentlich fertig. Ich denke, das liegt daran, dass der Wert nicht sofort zurückgegeben wurde. Also diese setTimeout Funktion ist kein Weg zu gehen. Allerdings habe ich hier ein echtes Problem. Das ist einfach viel zu schnell und im Code des realen Lebens würde dies den Zähler nicht erhöhen, es würde eine fremde API aufrufen, die nicht so viele Anrufe in so kurzer Zeit akzeptiert, also wollte ich zwischen jedem Anruf eine Verzögerung machen, wie es ist das richtig gemacht?

+1

Haben Sie versucht, die streams2-Methoden (z. B. 'threadPages.read()' und das ''lesbare'' Ereignis) zu verwenden, anstatt einen''daten''-Ereignishandler zu verwenden? Andernfalls sollten Sie in der Lage sein, den Stream je nach Bedarf manuell zu pausieren() und fortzusetzen(). – mscdex

Antwort

0

Dies ist meine Abhilfe:

var threadPages = db.collection('tmp_threadPages').find(); 
    var delay = 0; 

    function test(doc, delay){ 
    setTimeout(function(){ 
     console.log(delay); 
    }, delay) 
    } 

    threadPages.on('data', (doc) => { 
    test(doc, delay); 
    delay += 100; 
    }); 

Es funktioniert gut, wenn Sie die richtigen Ereignisse on('end Methode nicht binden müssen. Grundsätzlich erhöht sich die Verzögerung pro Anfrage, andernfalls würde sie alle gleichzeitig auslösen. Dadurch wird der Code langsamer und die API wird nicht mit zu vielen Anfragen pro Sekunde überfüllt.

0

Dann würden Sie irgendeine Art von queu zB benötigen:

queuTasks = []; 
queuTasks.push("Task1"); 
queuTasks.push("Task2"); 

function doTasks(){ 

    // Do your task 
    if(queuTasks.length > 0){ 
     console.log(queuTasks[0]); 
     queuTasks.splice(0,1); // Remove it from the queu 
    } 
    setTimeout(function(){ doTasks();}, 1000); 
} 

Dies ist nur ein paar schnelle Code i gemacht, kann aus der Box nicht funktionieren. Aber denk, du kommst auf die Idee.

Ich weiß, das, was Sie fragen nicht vollständig ist über

Verwandte Themen