1

私は大学の図書館のウェブサイトで映画ブラウザプロジェクトに取り組んでいる学生です。私はJavascriptの経験がありますが、このプロジェクトの調査を除いて、XMLまたはJSONの経験はありません。

非表示のAPIキーを使用して、保有しているすべてのDVDについてWorldCat Search APIにクエリを実行し、MARCXMLの結果をJSONに変換する必要があります。ライブラリサーバーはサーバーサイドスクリプトをサポートしていないため、Yahoo Pipesを使用することにしました。これにより、APIキーを秘密の文字列で「非表示」にして、結果をJSONとして返すことができます。

私の問題は、時々(しかし常にではない)エラーメッセージを受け取ることです:

TypeError: root is undefined

このエラーとの不一致は読み込み時間によるものだと思います(JSONオブジェクトが完全に読み込まれる前にJavascriptが実行しようとしている可能性がありますか?このエラーを回避するためにコードの効率を向上させるにはどうすればよいですか?アドバイスをありがとうございます。

以下に、このエラーを再現することがある私のコードの短縮例を示します。

<!DOCTYPE html>
<html>
<head>
<script>
var my_JSON_object = {};
var movieArray = new Array();
var subject = 'Science+Fiction';
var recordSet = 1;

loadJSON(0);

function loadJSON(set) 
{
    if (set == 0)
        var yahooPipe = 'http://pipes.yahoo.com/pipes/pipe.run?_id=b54472aff1548e93022d07fddfd6aa38&_render=json&maximumRecords=20&startRecord=1&subject='+subject+'&_callback=getData';
    else
        var yahooPipe = 'http://pipes.yahoo.com/pipes/pipe.run?_id=b54472aff1548e93022d07fddfd6aa38&_render=json&maximumRecords=20&startRecord='+((set*20)+1)+'&subject='+subject+'&_callback=getNextData';
    var head = document.getElementsByTagName('head')[0];         
    var newJS = document.createElement('script');

    newJS.type = 'text/javascript';
    newJS.src = yahooPipe;
    head.appendChild(newJS);
}

function getData(json)
{
    my_JSON_object = json;
    if (my_JSON_object.value.items[0].numberOfRecords>0)
        prepData(0);
    else
        alert("No results...");
}

function getNextData(json)
{
    my_JSON_object = json;
    prepData(recordSet);
}

function loadData()
{   
    loadJSON(recordSet);
    recordSet++;
}

function prepData(set)
{
    var root = my_JSON_object.value.items[0];   

    if (set == 0 && root.numberOfRecords == 1)
    {
        root.records.record[0] = root.records.record;
    }

    for (var i=0; i<20; i++)
    {
        if (root.records.record[i]==undefined)  
        {
            document.getElementById('A1').innerHTML=root.numberOfRecords;
            document.getElementById('A2').innerHTML=movieArray[set*20+i-1];
            break;
        }

        for (var j=0; j<root.records.record[i].recordData.record.datafield.length; j++)
        {
            if (root.records.record[i].recordData.record.datafield[j].tag == 245)
            {               
                for (var k=0; k<root.records.record[i].recordData.record.datafield[j].subfield.length; k++)
                {
                    if (root.records.record[i].recordData.record.datafield[j].subfield[k].code == "a")
                    {
                        movieArray[i+(set*20)] = root.records.record[i].recordData.record.datafield[j].subfield[k].content; 
                        break;
                    }
                }
            }
        }
    }

    if (set*20<root.numberOfRecords)
        loadData();
}

</script>
</head>
<body>

<p><b>Results:</b><span id="A1"></span></p>
<p><b>Title(last record):</b><span id="A2"></span></p>

</body>
</html>
4

0 に答える 0