用回调连接JSON对象并导出结果

Concatenating JSON objects with callbacks and exporting result

本文关键字:结果 对象 回调 连接 JSON      更新时间:2023-09-26

完全披露,我对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被完美地创造出来了。

我的问题,我何时以及如何将QBObjectPlayerObject结合起来,记住我还必须将其与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);
});