Javascript 使用Cheerio的Nodejs Webscraping函数在完成之前返回

Javascript 使用Cheerio的Nodejs Webscraping函数在完成之前返回,javascript,node.js,asynchronous,web-scraping,cheerio,Javascript,Node.js,Asynchronous,Web Scraping,Cheerio,我目前正在做一个简单的网页抓取nodejs程序。它基于cheerio,我从一个网站上获取项目,并从那里提取一些信息 据我所知,我在foreach循环中调用的所有函数都是同步的,因此它们应该从上到下执行。因为foreach循环也是一个普通的循环,它在js中执行sync,所以函数应该返回我完成的数组。但它却变得不明确,当我直接将它登录到控制台时,它就可以工作了(?) 如果您能解释我的错误所在并帮助我修复,我将不胜感激。函数getIntensiv(){ function getIntensiv(){

我目前正在做一个简单的网页抓取nodejs程序。它基于cheerio,我从一个网站上获取项目,并从那里提取一些信息

据我所知,我在foreach循环中调用的所有函数都是同步的,因此它们应该从上到下执行。因为foreach循环也是一个普通的循环,它在js中执行sync,所以函数应该返回我完成的数组。但它却变得不明确,当我直接将它登录到控制台时,它就可以工作了(?)

如果您能解释我的错误所在并帮助我修复,我将不胜感激。

函数getIntensiv(){
function getIntensiv(){
const cheerio = require('cheerio')
const request = require('request')

var intensivregister = [];
request.get({url: 'https://www.w3schools.com/html/html_tables.asp'}, function(err,res,body){


var $ = cheerio.load(body);

    $('#customers').children('tbody').children('tr').each(function(i, elem){
        var name = $(elem).children('td').first().text().trim().split("\n")[0].trim();                        
        var zipcity = $(elem).children('td').first().children('small').last().text();                         
        var streetnr = $(elem).children('td').first().children('br').last().prev().text();                    
        intensivregister.push({'name': name, 'zipcity': zipcity, 'streetnr': streetnr});
    });
    console.log(intensivregister);  //works and prints the finished array
    return null;        //returns undefined before function finished
});
return null;   //***<---This is returning and not the above return. If no return statement is written then undefined is passed.***
};

var retrunVal = getIntensiv()
console.log(retrunVal);
const cheerio=require('cheerio') const request=require('请求') var intensivregister=[]; 获取({url:'https://www.w3schools.com/html/html_tables.asp'},函数(err,res,body){ var$=总负荷(车身); $(“#客户”)。子项('tbody')。子项('tr')。每个(函数(i,elem){ 变量名称=$(elem).children('td').first().text().trim().split(“\n”)[0].trim(); var zipcity=$(elem).children('td').first().children('small').last().text(); var streetnr=$(elem).children('td').first().children('br').last().prev().text(); push({'name':name'zipcity':zipcity'streetnr':streetnr}); }); console.log(intensivregister);//工作并打印完成的数组 return null;//在函数完成之前返回未定义 });
return null;//***好吧,我发现我对javascript的想法不是你应该如何使用它。我解决了我的问题,摆脱了从函数返回值的想法(这主要来自于我的异步编程经验)而不是使用回调参数,我给我的函数,并在我的请求结束时调用

function getIntensiv(callback){
    var intensivregister = [];
    request.post(...);
    **callback(intensivregister);**
}

什么也起作用(我认为是更好的解决方案)正在使用承诺,例如,使用请求承诺并在最终调用中调用回调。

您正在从request.post回调返回一些内容。函数本身不返回任何内容。我现在使用了第二个返回,但我的数组为空,因此显然它在请求之前返回。post完成填充我的数组。。。
function getIntensiv(callback){
    var intensivregister = [];
    request.post(...);
    **callback(intensivregister);**
}