我的nodejs脚本有问题



你能帮我提示:d吗?这是我的代码:

const request = require('request');
const cheerio = require('cheerio');
function getUrls(url) {
    const baseUrl = 'https://unsplash.com';
    let urls = [];
    request(url, (err, res, body) => {
        if (!err && res.statusCode === 200) {
            const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
            $('.photo.qa-photo a').each((i, e) => {
                const lnk = $(e).attr('href');
                if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) {
                    urls.push(baseUrl + lnk);
                }
            });
        }
    });
    return urls;
}
function getImages(arr) {
    let images = [];
    for (const url of arr) {
        request(url, (err, res, body) => {
            if (!err && res.statusCode === 200) {
                const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
                $('script').each((i, e) => {
                    if (i === 4) {
                        let img = $(e).text();
                        img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3);
                        images.push(img);
                    }
                });
            } else {
                console.log(err, res.statusCode);
            }
        });
    }
    return images;
}
console.log(getImages(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button=')));

单独函数运行良好,但是如果我想组合两个函数控制台。对不起我的英语不好。有了这个小程序,我想从unsplash.com获取20张图像的完整URL提前。

bacause请求函数异步调用,因此parent函数(geturls,getimages)在填充数组之前返回。您必须使用回调。

javaScript是一种异步语言。这里发生的事情是您的getImages功能不等待您的getUrls函数完成。

您需要在getImages功能中使用回调或承诺,以便等待getUrls

以下是回调的一些教程

回调是JavaScript中非常重要的概念,我强烈建议您了解其工作原理。这将使您的生活更轻松。承诺也是如此。

这是您的代码的示例

const request = require('request');
const cheerio = require('cheerio');
// callback is the function to be called when this one finishes
function getUrls(url, callback) {
    const baseUrl = 'https://unsplash.com';
    let urls = [];
    request(url, (err, res, body) => {
        if (!err && res.statusCode === 200) {
            const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
            $('.photo.qa-photo a').each((i, e) => {
                const lnk = $(e).attr('href');
                if (lnk.indexOf('@') === -1 && lnk.indexOf('download') === -1) {
                    urls.push(baseUrl + lnk);
                }
            });
        }
    });
    //Notice the call to callback.
    callback(urls);
}
function getImages(arr) {
    let images = [];
    for (const url of arr) {
        request(url, (err, res, body) => {
            if (!err && res.statusCode === 200) {
                const $ = cheerio.load(body, { normalizeWhitespace: false, xmlMode: false, decodeEntities: true });
                $('script').each((i, e) => {
                    if (i === 4) {
                        let img = $(e).text();
                        img = img.substring(img.indexOf('full') + 7, img.indexOf('regular') - 3);
                        images.push(img);
                    }
                });
            } else {
                console.log(err, res.statusCode);
            }
        });
    }
    return images;
}
console.log(getUrls('https://unsplash.com/search?utf8=%E2%9C%93&keyword=life&button=', function(urls){getImages(urls)}));

我尚未测试它,但是它应该起作用或足够近。

最新更新