Javascript undefined nach funktion?
Hallo,
ich möchte einen webScraper schreiben, nachdem ich hier aber die init() für die browser und page instanzen aufrufe, werden die als undefined zurückgeliefert. Innerhalb der funktion ist typeof browser und page "object", wenn ich die Werte dann ausserhalb aufrufen möchte, sind sie "undefined". Ich benutze Nodejs und Puppeteer
async function init() {
try {
browser = await puppeteer.launch({
headless: true,
args: ["--disable-setuid-sandbox"],
ignoreHTTPSErrors: true,
});
page = await browser.newPage();
console.log(typeof browser);
console.log(typeof page);
} catch (err) {
console.log(err.message);
}
return {
first: page,
second: browser,
};
}
var retvals = init();
browser = retvals.second;
page = retvals.first;
console.log("here: ");
console.log(typeof retvals.second);
console.log(typeof retvals.first);
scrapeSite(urls[0]);
Verstehe nicht wirklich, was daran nicht funktionieren sollte, liegt aber vermutlich daran, dass ich wenig JS kenntnisse habe :D
MfG und danke im Voraus.
2 Antworten
Es gibt soetwas wie einen "Scope" in Javascript und auch vielen anderen Programmiersprachen.
Wie genau das hier aussieht,w eiß ich allerdings nicht, Javascript ist da an verschiedenen Stellen etwas kompliziert.
Siehe dazu auch:
https://262.ecma-international.org/5.1/
tl;dr Am leichtesten ist es, du unterscheidest nur zwischen Local und Global scope:
https://www.w3schools.com/js/js_scope.asp
So funktioniert das auch in anderen Programmiersprachen.
Wenn es komplizierter wird, recherchierst du dann einfach zum Sonderfall.
Auf das Ergebnis von init wird der Programmfluss wohl nicht warten.
Löse es so:
/* init, etc. ... */
async function scrape() {
var retvals = await init();
browser = retvals.second;
page = retvals.first;
/* etc. ... */
}
scrape();
Es wäre übrigens besserer Stil, wenn du nur mit lokalen Variablen arbeiten würdest, statt mit globalen (browser, page). Nutze die Schlüsselwörter let/const zur Deklaration.
Der Scope ist nicht das Problem, denn die Variablen (browser, page) sind in seinem Fall global deklariert. Problematisch hingegen ist die Reihenfolge der Ausführung.