Verzögerung jeder loop-iteration in node js, async
Habe ich den folgenden code:
var request = require('request');
var cheerio = require ("cheerio");
var async= require("async");
var MyLink="www.mylink.com";
async.series([
function(callback){
request(Mylink, function (error, response, body) {
if (error) return callback(error);
var $ = cheerio.load(body);
//Some calculations where I get NewUrl variable...
TheUrl=NewUrl;
callback();
});
},
function(callback){
for (var i = 0; i <=TheUrl.length-1; i++) {
var url = 'www.myurl.com='+TheUrl[i];
request(url, function(error, resp, body) {
if (error) return callback(error);
var $ = cheerio.load(body);
//Some calculations again...
callback();
});
};
}
], function(error){
if (error) return next(error);
});
Hat jemand einen Vorschlag, wie ich verzögern kann jeder loop-iteration in der for loop
? Sagen, der code wartet 10 Sekunden nach jeder iteration abgeschlossen ist. Ich habe versucht setTimeout
aber nicht geschafft, dass zu arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ein timeout für die Ausführung des Codes in wachsenden Abständen, wie diese:
Also die erste läuft sofort (Intervall * 0 ist 0), die zweite läuft nach zehn Sekunden, etc.
Müssen Sie senden
i
als letzter parameter in dersetTimeout()
so, dass Ihr Wert ist an die Funktion-argument. Ansonsten ist der Zugriff auf den array-Wert (out-of-bounds, und Sie erhaltenundefined
.}, interval * i, i);
zu}, interval * 1, i);
voni to 1
? Code funktioniert nicht dann, wenn ich will, eine Konstante intervall.setTimeout()
sofort zurückgegeben. Es muss nicht da sitzen und warten, bis der timeout vor dem zurückgeben der Steuerung an diefor
Schleife. Also, wenn Sieinterval * 1
(das ist das gleiche wie nurinterval
, dann sind Sie laufen alles zehn Sekunden in der Zukunft alle auf einmal (mehr oder weniger-Sie werden nur ein paar Millisekunden auseinander, aber das ist es). Aber wenn Sieinterval * i
, das ist "gleich" das erste mal durch, "zehn Sekunden in die Zukunft" das zweite mal durch die loop, "zwanzig Sekunden in der Zukunft" das Dritte mal, usw.interval*1
bekam aber keine Ergebnisse... Aber ich verstehe, was du meinst! Thansk.Andere alternative wäre die Verwendung
async.eachSeries
. Zum Beispiel:Verzögerung mehrere Seite holt mit
async/await
Ich bin ein großer fan der asynchronen Bibliothek und ich habe für eine lange Zeit verwendet. Jedoch, jetzt gibt es
async/await
. Ihr code wird leichter zu Lesen. Zum Beispiel, wäre dies die wichtigste Funktion:Viel besser, nicht wahr? Bevor ich in die details, wie
fetchPage()
undfetchUrls()
Arbeit, lassen Sie uns zunächst die Antwort auf Ihre Frage, wie zu warten, bevor das abrufen der nächsten Seite. Die sleep-Funktion ist ziemlich einfach:Können Sie eine vollständige Erklärung, wie es funktioniert in meiner anderen Antwort hier.
Ok, zurück zu den anderen Funktionen. Die
request
Bibliothek hat ein Versprechen-fähigen version, die Sie verwenden können, mitasync/await
. Lassen Sie uns schauen, wie ' sfetchPage()
umgesetzt:Seit
request
ist wieder ein Versprechen, wir könnenawait
auf Sie. Ich nutzte auch die chance, dastransform
Eigenschaft, die es uns ermöglicht Transform der Antwort body vor der Lösung der Verheißung. Ich bin der übergabe durch Cheerio, genauso, wie Sie es in Ihrem code.Schließlich
fetchUrls()
können einfach anrufenfetchPage()
zu und verarbeiten es zu Holen Ihr array von URLs vor der Lösung seiner Versprechen. Hier ist der vollständige code:Verwenden
request
mit dem Versprechen, installieren Sie es wie folgt:Dann
require("request-promise-native")
im code, wie im Beispiel oben.Da Sie bereits mit
async
,async.wilst
würde gut tun, die als Ersatz fürfor
.whilst
ist eine asynchronewhile
-like-Funktion. In jeder iteration wird nur ausgeführt, nachdem die vorherigen iteration genannt hat seiner Fertigstellung Rückruf. In diesem Fall können wir einfach verschieben, Ausführung der Rückruf bei Abschluss von 10 Sekunden mitsetTimeout
.