坦白说,我对 NodeJS 和 Express 都是新手。但是,下面的代码可以工作并经过测试,因此这应该是一个很好的起点。
我正在尝试抓取同一网站上的各个页面,将数据从每个页面提取到一个大的 JSON 对象中。然后我想将所有这些 JSON 对象合并为一个甚至更大的 JSON 对象,然后我想将其导出,以便可以在另一个文件中调用它。
这是我的dataFetch.js
:
var request = require('request'),
jsdom = require('jsdom');
var PlayerData = [];
var QBFunction = jsdom.env({
url: 'http://www.fantasypros.com/nfl/projections/qb.php',
scripts: ["http://code.jquery.com/jquery.js"],
done: function (errors, window) {
var $ = window.$;
var table = $("tbody:gt(0)").hide();
var QBObject = [];
table.find("tr").each(function (i, el) {
var $tds = $(this).find('td');
QBObject.push({
'position': 'QB',
'name': $tds.eq(0).text(),
'passing_attempts': $tds.eq(1).text(),
'completions': $tds.eq(2).text(),
'passing_yards': $tds.eq(3).text(),
'passing_tds': $tds.eq(4).text(),
'interceptions': $tds.eq(5).text(),
'rushing_attempts': $tds.eq(6).text(),
'rushing_yards': $tds.eq(7).text(),
'rushing_tds': $tds.eq(8).text(),
'fumbles_lost': $tds.eq(9).text(),
'standard_projection': $tds.eq(10).text()
});
});
}
})
exports.PlayerData = PlayerData;
以上,QBObject
是我在抓取网页时创建的初始 JSON 对象的示例。我的想法是,我对每个位置都执行此操作,因此想象一下,我对 5 个不同的位置都有相同的代码(为了简洁起见,我将其省略了)。 QBObject
正在完美创建。
我的问题是,何时以及如何合并 QBObject
与 PlayerObject
,请记住,我还必须将其与 RBObject
结合起来。 , ETC...?我很困惑,因为 QBObject
正在回调中创建,我是异步编程的新手。我尝试连接回调中的 JSON 对象并将其打印到控制台,但它是空的(我假设是因为控制台日志是在创建 JSON 对象之前执行的)。
最后,如果一切按计划进行,PlayerObject
JSON 已按预期创建,将是一个简单的
var dataFetch = require('./dataFetch');
var PlayerData = dataFetch.PlayerObject;
足以将该数据放入另一个 JavaScript 文件中吗?感谢任何人的帮助,任何事情都值得赞赏。
最佳答案
您可能会发现这些讨论很有用:
How do JavaScript closures work?
Idiomatic way to wait for multiple callbacks in Node.js
解决这个问题的初步尝试(我可能很快就会重构)可能看起来像:
var request = require('request');
var jsdom = require('jsdom');
function fetchPlayerData(done) {
var playerObject;
function gotData() {
if ( playerObject.RBObject && playerObject.QBObject ) {
//if all went well, we should have data for all positions
done(playerObject);
}
}
function qbReady(errors, window) {
//existing code for scraping except...
playerObject.QBObject = {
position: 'qb',
name: $tds.eq(0).text()
};
//we write to the player object instead of a local
gotData();
}
function rbReady(errors, window) {
//same for other positions
playerObject.RBObject = {position: 'rb'};
gotData();
}
jsdom.env({
url: 'http://www.fantasypros.com/nfl/projections/qb.php',
scripts: ["http://code.jquery.com/jquery.js"],
done: qbReady
});
jsdom.env({
url: 'http://www.fantasypros.com/nfl/projections/rb.php',
scripts: ["http://code.jquery.com/jquery.js"],
done: rbReady
});
}
module.exports = {
fecthPlayerData: fetchPlayerData
};
然后用法会是这样的:
var fetch = require('./dataFetch');
fetch.fetchPlayerData(function(data){
console.log(data.QBObject);
});
关于javascript - 将 JSON 对象与回调连接并导出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022241/