从请求外部调用请求函数

时间:2018-04-18 20:20:12

标签: javascript node.js node-request

我试图制作一个网络浏览器(教育用途),我真的很远,但这个小问题困扰着我。

我发出了一个请求回调函数,我试图让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]));
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

您可以使用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);