用回调连接JSON对象并导出结果
Concatenating JSON objects with callbacks and exporting result
完全披露,我对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
等结合起来……?我很困惑,因为QBObject
是在回调中创建的,我是异步编程的新手。我尝试在回调中连接JSON对象并将其打印到控制台,但它是空的(我假设是因为在创建JSON对象之前执行了控制台日志)。
最后,如果一切按计划进行并且PlayerObject
JSON按预期创建,那么一个简单的
var dataFetch = require('./dataFetch');
var PlayerData = dataFetch.PlayerObject;
足以将数据带入另一个javascript文件?谢谢任何人的帮助,任何事情都很感激。
您可能会发现这些讨论很有用:
JavaScript闭包是如何工作的?
在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);
});
相关文章:
- 对象拟合:获取结果尺寸
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- JQuery Deferred Ajax,将结果保存在调用对象中
- 在页面对象文件中验证sendKeys结果会导致未定义的错误(Protractor)
- 返回带有筛选结果的新JSON对象
- 为什么纬度结果对象从谷歌地图 API 更改
- 当我运行代码时,我得到以下结果 []对象对象] [对象对象],但应该给我一个有序数组
- 为什么脚本 Db 查询结果对象不同
- 获取 FileReader() 的结果对象
- 从 Webix 中结果对象的属性加载数据
- 如何在函数中返回结果对象
- 如何在对象数组中循环Json结果对象
- 将FileReader内部的结果对象分配给变量
- JS不给出任何结果(对象)
- 在带有填充嵌套数组的mongoDB文档中查找并构建新的结果对象
- 敲出$parent点击click事件很好,但是结果对象的属性没有定义
- 更正JSON结果对象
- 将查询结果对象传递给单独的函数
- 从结果对象数组中获取一个值
- JSON响应的问题,结果对象的属性被读取为未定义,但我可以看到它存在