【问题标题】:node.js Async URL Retrieval to JSONnode.js 异步 URL 检索到 JSON
【发布时间】:2013-12-22 13:16:03
【问题描述】:

下面的代码会从 URL 中为代码中的每个键获取一个 JavaScript 变量,然后一旦成功检索到所有变量,它就会根据累积结果创建一个 JSON 对象。这在客户端效果很好,但我想每 15 分钟在服务器端进行一次处理(用于更多关键代码)。我当然可以在 Python 中拼凑一些东西来做到这一点,但考虑到代码在 JS 中是如此简单,这似乎有点荒谬。我对 node.js 不太熟悉,但在阅读了它之后,我认为它可能是最好的解决方案——尽管我确信还有其他选择。我将如何对脚本检索进行排队,以便在它们全部完成后收到一条消息,并且可以将 JSON 文件发布到服务器上的存储位置?这可以在服务器端使用 node exampleFile.js 之类的东西完成吗?

var codes = {'C': {}, 'S': {}, 'W': {}};
var keys = [];
for (var k in codes) keys.push(k);
var queue = keys.map(function (d) {
    var url = "http://www.agricharts.com/marketdata/jsquote.php?user=&pass=&allsymbols=" + d;
    return $.getScript(url)
        .done(function (e, textStatus) {
            codes[d] = qb; // qb is the name of the JS variable found in the URL
        });
    });

$.when.apply(null, queue).done(function () {
    var output = JSON.stringify(codes); // save this JSON file to the server for    processing on the client side
});

【问题讨论】:

    标签: javascript json node.js asynchronous


    【解决方案1】:

    你可以做一个 http 获取:

    require('http');
    
    var codes = {'C': {}, 'S': {}, 'W': {}};
    var keys = [];
    for (var k in codes) keys.push(k);
    var counter = 0;
    keys.map(function(d){
        var url = "http://www.agricharts.com/marketdata/jsquote.php?user=&pass=&allsymbols=" + d;
        http.get(url, function(res) {
            var scriptData = '';
            res.on('data', function (chunk) {
                scriptData+=chunk;
            });
            res.on('end',function(){
                counter++;
                eval(scriptData); 
                codes[d] = qb;
                if(counter==keys.length){
                    var output = JSON.stringify(codes); // save this JSON file to the server for    processing on the client side
                }
            });
        });
    });
    

    之后,您可以排队并将结果发布到服务器。签出:http://nodejs.org/api/http.html#http_http_get_options_callback

    V8 VM 实现了 ECMAScript 规范,所以你可以在浏览器中做的很多事情,除了 DOM 操作,都可以在 nodejs 中完成,比如 eval 函数

    【讨论】:

    • 我试过了,但 res 似乎有比我需要的脚本更多的信息,而且我似乎找不到我正在寻找的变量 'qb' (var qb = { 'SF14': { name: 'Soybeans (P)', flag: 's', price_2_close: '1319.75', open_interest: '256213'...}})
    • 这非常适合检索和保存脚本...谢谢。当我将 http.get 请求包装在 keys.map 代码中时,我可以一次获取每个脚本,但是我怎么知道它们什么时候都完成了,以便我可以做进一步的处理。 jquery.when.apply 代码在这里不起作用。
    • 我不知道。为什么不使用 for 循环?
    • 或者使用map函数,在eval之后添加一个计数器,当计数器等于keys.length时,将数组保存到服务器
    • 我确实让这种方式太复杂了。感谢您提供简单的解决方案。
    猜你喜欢
    • 2015-07-02
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2013-05-11
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多