我正在使用nodejs
和cheerio
来抓取网站上的数据,并从中创建一个对象。然后,它需要获取该对象并在函数中使用它。
问题是,我的对象正在创建,但在cheerio
可以正确解析数据并将其放入对象之前,下一个函数已经在运行。这是我的代码:
function getInfo(obj, link){
request(link, function(err, resp, body) {
if (err) {
console.log("Uh-oh: " + err);
throw err;
}
$ = cheerio.load(body);
function createProduct(obj, callback){
var product = {
name : $('#name').text(),
gender : obj.gender,
infoLink : link,
designer : $('.label').first().text(),
price : $('#price').first().text(),
description : $('.description').text(),
date : new Date()
}
product.systemName = (function(){
return product.name.replace(/\s+/g, ' ');
}());
callback(product);
}
createProduct(obj, function(product){
lookUp(product);
});
我在这里得到的结果好坏参半。一些product
个对象被正确地发送到函数,正确输入所有细节。有些缺少描述,有些缺少每个cheerio
- 填充的内容。其他人有一些cheerio
抓取的内容,但缺少某些位。 gender
和date
属性始终存在,属性存在,但它们只是空白(例如product.name
返回""
而不是未定义。)
我检查了每个违规链接,所有页面都包含要删除的正确选择器。
如何填充product
对象后,如何将回调设置为ONLY功能?
答案 0 :(得分:1)
有两种可能的异步执行可以获得这些结果:
cheerio.load
在调用createProduct
之前尚未完成。createProduct
product
在调用callback
之前未填充或部分描述(不确定)。您可以使用async库来同步执行函数(使用async.series
)。如果createProduct
也是异步的,则必须以类似的方式使其同步。
async.series([
function(callback){
$ = cheerio.load(body);
callback();
},
function(callback){
createProduct(obj, function(product){
lookUp(product);
});
callback();
}
]);