javascript - 将 JSON 对象与回调连接并导出结果

标签 javascript json node.js jsdom

坦白说,我对 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 结合起来。 , 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/

相关文章:

javascript - 将 JSON 输出一一附加到输入框和标签

javascript - NodeJS : Convert table string (with\n\r and\t) to JSON

node.js - 可能的 socket.io 内存泄漏

javascript - 如何在网络浏览器中检查 JavaScript 版本?

javascript - 将导航包裹在子导航中

Javascript - 在没有 eval() 的情况下分配动态值

json - Go-Gorm 中的深层嵌套结构

node.js - 在nodejs中从其他模型sequelize中检索数据

java - 设计师如何使用 Google Web 工具包?

JavaScript .map 返回