NodeJS-如何同步运行请求承诺?

时间:2020-03-22 18:35:10

标签: node.js web-scraping request cheerio

我首先有两个函数,在那个循环中有一个for循环,我在调用第二个具有请求承诺的函数。我担心的是,当循环正在执行并调用第二个函数时,它不等待请求承诺完成,因此循环将在下一个迭代并再次调用第二个函数。 我希望先完成请求,然后再下一次循环。那我该怎么办呢?为了简单起见,我粘贴第一个和第二个功能的代码段

第一个功能代码段


for (let i = 0; i < len; ++i) {
    var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
    console.log(allUrls_);
    console.log('getValues URL: ' + url_);
    getValues(res, url_, allUrls_)
}

第二功能

const rp = require('request-promise');
const cheerio = require('cheerio');

function getValues(res, url_, allUrls_) {
    let options = {
        uri: url_,
        transform: function (body) {
            return cheerio.load(body);
        }
    };
    console.log('inside getValues');
    rp(options)
        .then(function ($) {
            console.log('inside getValues function request');
            $('.some-selector').map(function (i, links) {
                // my custom code
            })
        })
        .catch(function (err) {
            // catch errors
        })
}

1 个答案:

答案 0 :(得分:1)

如果您从getValues()返回承诺,则可以在async/await循环中将for与承诺一起使用,以暂停getValues()的每次调用并对其进行排序成为一个接一个,而不是同时运行:

const rp = require('request-promise');
const cheerio = require('cheerio');

function getValues(res, url_, allUrls_) {
    let options = {
        uri: url_,
        transform: function (body) {
            return cheerio.load(body);
        }
    };
    console.log('inside getValues');
    return rp(options).then(function($) {               // return promise here
        console.log('inside getValues function request');

cheerio在这里 $('。some-selector')。map(function(i,links){ //我的自定义代码 }) 退货//大概在这里返回一些东西 }); }

async function process() {
    try {
        for (let i = 0; i < len; ++i) {
            var url_ = "https://www.someurl****.com" + allUrls_ + urlLastParam + (i + 1).toString();
            console.log(allUrls_);
            console.log('getValues URL: ' + url_);
            let value = await getValues(res, url_, allUrls_);     // await here
        } catch(e) {
            console.log(e);
            // handle any error that occurred in getValues()
        }
    }
}

仅供参考,$('.some-selector')不能像您在这段代码中那样工作。 $是您的HTML。您必须先将html内容加载到cheerio中,然后才能执行此操作(我已将其添加到我的答案中)。

相关问题