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?
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