1

尊敬する人々 ....

これは私のnode.jsコードです... https://gist.github.com/SkyKOG/99d47dbe5a2cec97426b

試験結果のデータを解析しようとしています...例... http://www.vtualerts.com/results/get_res.php?usn=1MV09IS002&sem=7

私は結果を取得しています...そして私は以前のようにもトラバースしています...すべてが機能しますが、トラバースバックはランダムに発生します...おそらくループに何か問題があります...

            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);

sems を正しい順序で並べ替えるために正しく実装する必要がある非同期の概念のようなものがあると思います...

そして、この形式で JSON を取得するには... https://gist.github.com/SkyKOG/3845d6a94cea3b744296 作成されたオブジェクトを適切なスコープでプッシュしているとは思わない...

この点で親切に助けてください....ありがとう...

4

1 に答える 1

1

(注文の部分にお答えします。Q&A 形式に合わせて、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)
}

ライブラリを使用する

async.parallel()Caolan の優れたライブラリで呼び出しを確認してください。関数の配列を渡すと、結果の配列とともにコールバックに返されます。

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

適切な変数を含む関数のカリー化されたバージョンを配列に取り込むループを作成する必要があります。

于 2013-05-23T08:54:56.043 に答える