【问题标题】:Node.js loops and JSON buildingNode.js 循环和 JSON 构建
【发布时间】:2013-05-18 09:44:06
【问题描述】:

尊敬的人......

这是我的 node.js 代码... https://gist.github.com/SkyKOG/99d47dbe5a2cec97426b

我正在尝试解析我们的考试结果数据...示例... http://www.vtualerts.com/results/get_res.php?usn=1MV09IS002&sem=7

我得到了结果......而且我正在回溯以前的似乎也是...... 除了遍历之外,所有的工作都是随机发生的...... prolly 循环有问题......

            json.results = [];

            var output = '';

            var k = response.query.results.body.div.div[0].table[1].tr.length;

            for (var j = 1; j < k; j++) {

                for (var i = 0; i <= 5; i++) {
                    var result_obj = {};
                    result_obj.subjects = [];

                    for (key in response.query.results.body.div.div[0].table[1].tr[j].td[i]) {
                        if (typeof response.query.results.body.div.div[0].table[1].tr[j].td[i].em === "undefined") {
                            continue;
                        }

                        var subject_obj = {};

                        output += "Subject : " + response.query.results.body.div.div[0].table[1].tr[j].td[i].em + " " + "\n";

                        var subtext = response.query.results.body.div.div[0].table[1].tr[j].td[i].em + " " + "\n";
                        subject_obj.subjectname = subtext.replace(/[(].*[)]/, "").trim();

                        result_obj.subjects.push(subject_obj);
                        console.log(subject_obj);
                        break;

                    }

                    console.log(result_obj.subjects);

我认为有一些类似异步概念的东西需要正确实现才能以正确的顺序重新排序 sem ...

并以这种格式获取 JSON ... https://gist.github.com/SkyKOG/3845d6a94cea3b744296 我不认为我在正确的范围内推动创建的对象......

请在这方面提供帮助....谢谢...

【问题讨论】:

    标签: javascript jquery json node.js parsing


    【解决方案1】:

    (我将回答排序部分。建议将 JSON 问题作为一个单独的问题,以符合问答格式。)

    当您在代码中发出 HTTP 请求时(请参见下面的行),您会为响应的执行顺序带来不同的延迟

    new YQL.exec(queryname, function (response) {
    

    您需要自己跟踪请求的顺序,或使用库为您完成。

    自己编码

    为了解决这个问题,您需要一些东西来跟踪请求的原始顺序。由于闭包的工作方式,您不能只增加一个简单的计数器,因为随着循环的进行,它会在全局范围内发生变化。解决这个问题的惯用方法是将计数器传递给立即执行的函数(作为值类型)

    例如

    var responseData = [];
    for ( var i = 0; i < 100; i++ ){
        (function(){
            ...
            // http call goes in here somewhere
                responseData[i] = data_from_this_response
            ...
        })(i)
    }
    

    使用库

    查看 Caolan 优秀库中的 async.parallel() 调用。您将一个函数数组传递给它,它会返回一个包含结果数组的回调。

    https://github.com/caolan/async/#parallel

    您需要创建一个循环,使用包含适当变量的函数的 curried 版本填充数组。

    【讨论】:

    • 非常感谢您的宝贵回复...我确实有类似的感觉...您解释得很好...我现在将检查 async.parallel() .... 有美好的一天....
    • 其实,再想想async.map() 可能更合适,而且代码更简单
    • Thnax 先生 ...我确实尝试过...但它仍然没有工作...我对实现这些概念很陌生...我认为我遇到了一些语义错误...我也尝试过放置 map 和 parallel ...请帮助我如何实现它...我已经尝试了很多天...这是我 github 上的最新代码...github.com/SkyKOG/luckyvturesults.com/blob/master/app.js
    • 感谢您对第三个循环的提示...正如您现在所看到的...我已经大大提高了清洁度...我什至尝试过实现这个...markandey.com/2012/12/how-to-get-output-of-multiple.html但问题仍然存在......
    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多