从请求外部调用请求函数

Call a Request function from outside the request

我正在尝试制作一个 webscraper(教育用途),而且我做得很远,但是这个小问题困扰着我。

我创建了一个请求回调函数,我正在尝试让第 75-78 行正常工作。然而,为了让它工作,我需要 PDF_LISTS 和 PDF_LINKS 来初始化正确的值。

我已经尝试让它们成为全局变量,但由于某种原因不起作用。所以我的问题是:如何创建一个回调函数来调用 for 循环 (75-78) 并成功将 PDF_LISTS 和 PDF_LINKS 初始化为正确的值?

(别担心,我在教授的许可下将其用于教育内容)。第一次在这里发帖!

// URL_LINKS has the pdf links of the pages
PDF_LINKS = [];
// URL_LIST has the names of the pdf links 
PDF_LIST = [];

function fillPDF(callback) {
    request(url, function(err, res, body) {
        $ = cheerio.load(body);
        links = $('a'); //jquery get all hyperlinks
        $(links).each(function(i, link) {

            var value = $(link).attr('href');
            // creates objects to hold the file 

            if (value.substring(value.length - 3, value.length) == "pdf") {
                PDF_LINKS[i] = $(link).attr('href');
                PDF_LIST[i] = $(link).text();
            }
        })
    });
}
// must decleare fillPDF variable or else you wont initilze teh variables

fillPDF() {
    //HERE I WANT PDF_LINKS and PDF_LIST to be intialized to 33.....
}
for (j = 0; j < PDF_LIST.length; j++) {
    request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
}

您可以使用 array's push method 将您的值推送到数组中,避免数组的元素未定义。

您可以将最终的 for 循环放入函数中,然后使用 fillPDF();

您还需要在请求结束后调用 fillPDF 的回调。

PDF_LINKS = [];
PDF_LIST = [];

function fillPDF(callback) {
    request(url, function(err, res, body) {
        $ = cheerio.load(body);
        links = $('a');
        $(links).each(function(i, link) {
            var value = $(link).attr('href');
            if (value.slice(-3) == "pdf") {
                PDF_LINKS.push(value);
                PDF_LIST.push($(link).text());
            }
        })
        callback();
    });
}

function writePDF() {
    for (j = 0; j < PDF_LIST.length; j++) {
        request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
    }
}

fillPDF(writePDF);