1

私はこの質問が何度か聞かれたことを知っていますが、前の質問のどれでも私のために働く解決策を見つけることができなかったようです。HTMLページの読み込みが完了すると設定される変数がありますが、コードがその変数にアクセスしようとすると、未定義であると表示されることがあります。すべてが正しく読み込まれるのを待っていると思うので、理由はわかりません。ほとんどの場合、すべてのコードが正常に実行されるため、この例外はランダムに発生するようです。これが私のコードの簡略化されたバージョンです:

var globalVar;

function initStuff(filePath) {
    // I wait till the HTML page is fully loaded before doing anything
    $(document).ready(function(){
        var video = document.getElementById("videoElementID");

        // My parseFile() function seems to run smoothly
        var arrayOfStuff = parseFile(filePath); 

        if (arrayOfStuff == null) {
            console.error("Unable to properly parse the file.");
        } else {
            setGlobalVariable(arrayOfStuff);
            video.addEventListener("play", updateVideoFrame, false);
        }
    });
}

function setGlobalVariable(arrayOfStuff) {
    window.globalVar = arrayOfStuff;
}

function updateVideoFrame() {
    // A bunch of other code happens first

    // This is the line that fails occasionally, saying 
    // "window.globalVar[0].aProperty.anArray[0] is undefined"
    var test = window.globalVar[0].aProperty.anArray[0].aProperty;
}

この問題を引き起こしている可能性があると私が考えることができる唯一のことは、ある種の同期性の問題です。しかし、なぜそうなるのかわかりません。助けてください!

編集:

非同期性の問題が私のparseFile(xmlFile)方法に起因する場合、これが私がそこで行っていることです。メソッドを強制的に同期的に実行するため、問題が発生している可能性はないと思いましたが、間違っている場合は、次のようになります。

function parseKML(xmlFile) {
    var arrayOfStuff = new Array();

    // Turn the AJAX asynchronicity off for the following GET command
    $.ajaxSetup( { async : false } );
    // Open the XML file
    $.get(xmlFile, {}, function(xml) {
        var doc = $("Document", xml);   
        // Code for parsing the XML file is here
        // arrayOfStuff() gets populated here
    });

    // Once I'm done processing the XML file, I turn asynchronicity back on, since that is AJAX's default state
    $.ajaxSetup( { async : true } );

    return arrayOfStuff;
}
4

2 に答える 2

2

コードで最初に行うべきことは、次のどの部分を把握することです。

window.globalVar[0].aProperty.anArray[0]

未定義です。

複数のチェーンされたプロパティ参照と配列参照があるため、チェーン内のさまざまな場所になる可能性があります。参照の直前にブレークポイントを設定してその内容を調べるか、いくつかのconsole.log()ステートメントを使用して構造のネストされた各部分を出力し、問題の場所を特定することをお勧めします。

console.log("globalVar = " + globalVar);
console.log("globalVar[0] = " + globalVar[0]);
console.log("globalVar[0].aProperty = " + globalVar[0].aProperty);
console.log("globalVar[0].aProperty.anArray = " + globalVar[0].aProperty.anArray);
console.log("globalVar[0].aProperty.anArray[0] = " + globalVar[0].aProperty.anArray[0]);

問題がglobalVarまだ設定されていない場合は、タイミングの問題または初期化の問題があります。

問題が他のプロパティの 1 つが設定されていないことである場合、globalVar を自分が考えているもので初期化していません。

また、データの一部が適切に設定されていない場合に適切に失敗するように、コードをより防御的に記述したい場合もあります。

于 2012-05-17T23:39:20.740 に答える
1

防御的プログラミングを使用する必要があります。 http://www.javascriptref.com/pdf/ch23_ed2.pdf

例:

var video = document.getElementById("videoElementID") || 0;

-

if( video && video.addEventListener ){
    video.addEventListener("play", updateVideoFrame, false);
}

コードの別のバージョンを次に示します。

window.globalVar = globalVar || [];
function setGlobalVariable(arrayOfStuff) {
    window.globalVar = arrayOfStuff;
}
function updateVideoFrame() {
    // A bunch of other code happens first

    // This is the line that fails occasionally, saying
    // "window.globalVar[0].aProperty.anArray[0] is undefined"
    if( window.globalVar ){
        var g = window.globalVar || [];
        var d = (g[0] || {})["aProperty"];
        // etc...
    }else{
        console.error( "test error." );
    }

}
function initStuff(filePath) {
    // I wait till the HTML page is fully loaded before doing anything
    $(document).ready(function () {
        var video = $("#videoElementID");

        // My parseFile() function seems to run smoothly
        var arrayOfStuff = parseFile(filePath) || [];

        if (arrayOfStuff == null || video == null ) {
            console.error("Unable to properly parse the file.");
        } else {
            setGlobalVariable(arrayOfStuff);
            video.bind("play", updateVideoFrame);
        }
    });
}
于 2012-05-17T23:36:51.913 に答える