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