繁体   English   中英

Node.js + Cheerio:循环内请求

[英]Node.js + Cheerio : Request inside a loop

我正在使用cheerio,request和Node.js。

当我在下面运行脚本时,它以错误的顺序输出名称。 我相信它是由它的异步性质引起的,如何使它按“正确”的顺序工作? 我是否需要使用同步程序包,或者是否可以通过某种方式对其进行更改,使其能够以同步方式工作?

app.get('/returned', function (req, res) {
    for (var y = 0; y < 10; y++) {
        var url = "http://example.com" + y + "/person.html";
        request(url, function (err, resp, body) {
            $ = cheerio.load(body);
            var links = $('#container');
            var name = links.find('span[itemprop="name"]').html(); // name
            if (name == null) {
                console.log("returned null");
            } else {
                console.log(name);
            }

        });
    }
});

Promise使这相对容易:

app.get('/returned', function (req, res) {
    let urls = [];
    for (let y = 0; y < 10; y++) {
        urls.push('http://example.com' + y + '/person.html');
    }
    Promise.all(urls.map(function (url) {
        return new Promise(resolve, reject) {
            request(url, function (err, resp, body) {
                if (err) {return reject(err);}
                let $ = cheerio.load(body);
                let links = $('#container');
                let name = links.find('span[itemprop="name"]').html(); // name
                resolve({name: name, links: links, url: url});
            });
        });
    }).then(function (result) {
        result.forEach(function (obj) {
            if (obj.name == null) {
                console.log(obj.url, "returned null");
            } else {
                console.log(obj.url, obj.name);
            }
        });
    }).catch(function (err) {
        console.log(err);
    });
});

我先创建一个要获取的URL数组,然后将其映射到一个Promise数组。 当每个请求完成时,我用名称,URL和链接解决了诺言。 当所有的诺言都完成后,我便遍历了结果,将以原始顺序进行。 这是并行运行的。

不,您不必使用同步程序包。 IMO最干净的方法是使用成熟的第三方库。

我建议异步。

async.series方法将按照给定的顺序执行所有请求函数,然后使您可以注册一个回调,以在发出所有请求或发生错误时触发。

https://github.com/caolan/async#seriestasks-callback

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM