Node.js + Cheerio : Request inside a loop

标签 node.js cheerio

我正在使用 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 和链接解决了 Promise。当所有 promise 完成后,我将循环结果,该结果将按原始顺序排列。这是并行运行的。

关于Node.js + Cheerio : Request inside a loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33506986/

相关文章:

node.js - 抽象类型 Node 必须在运行时解析为字段 Root.node 的对象类型,值为\"\",收到\"null\"。”

javascript - 我应该在仅调用已经在主体中使用try and catch的函数的函数中捕获错误吗?

javascript - Node 和 CMS 与 angularjs : how do they cooperate

angularjs - 如何将 Elastic Search 与 Meanjs (Mongodb、Express、Angular、Nodejs) 集成

node.js - 构建 React 项目时出现错误 : node_modules\react-native-fs\FS. common.js : Unexpected token, 预期 ","(30:29)

html - 如何使用nodejs模块使用xpath提取html内容

javascript - 无法从 github insights 页面抓取贡献者 div

javascript - 使用 Cheerio 和 jsonframe 抓取时,获取 TypeError : selector. includes is not a function

node.js - 使用 node.js 从 div 中检索文本

jquery-selectors - 如何使用 Cheerio 访问包含不同属性值的 DOM 属性?