2017-04-03 10 views
0

テキストファイルから読み込み、その内部に情報を配列に入れようとしています。しかし、私は何か間違っているようです。jQuery/Javascript:GET呼び出し後に変数が更新されない

var Level = function(ctx) { 
    this.ctx = ctx; 
    this.lvlWidth = 0; 
    this.lvlHeight = 0; 

    this.map = []; 


    this.loadLevel = function(){ 
    var start = 0; 
    var end = 0; 
    this.lvlHeight = 25; 
    this.lvlWidth = 21; 

    $.get("1.txt", function(data){ 
     start = data.indexOf("0"); 
     end = data.lastIndexOf("#"); 
     this.map = data.slice(start, end - 2).split(" "); 
    }, "text"); 

    console.log(this.map); 
    }; 
}; // end Level 

コンソールでは、私の変数this.mapがEMPTY ARRAYであると表示されます。それは自分自身を変更するものではありません。理由はわかりません。私は他の答えをチェックして、関数の外で変数を(私のケースマップで)宣言しなければ、この問題が起こると人々は言ったが、私が行ったことをはっきりと見ることができる。皮肉なことに、this.lvlWidthとthis.lvlHeight DOはそれぞれ21と25に変わります。誰も地図が更新されない理由を教えてもらえますか?ここで

が(このファイルと同じフォルダにある)1.TXTの情報です:

# startleveldata 
0 0 0 0 0 0 0 0 0 113 21 113 0 0 0 0 0 0 0 0 0 
0 107 100 100 100 100 100 100 100 106 0 105 100 100 100 100 100 100 100 108 0 
0 101 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 101 0 
0 101 3 120 2 113 2 111 100 108 2 107 100 112 2 113 2 120 3 101 0 
0 101 2 2 2 101 2 2 2 101 2 101 2 2 2 101 2 2 2 101 0 
0 101 2 111 100 106 2 113 2 110 2 110 2 113 2 105 100 112 2 101 0 
0 101 2 2 2 2 2 101 2 2 2 2 2 101 2 2 2 2 2 101 0 
0 101 2 120 2 111 100 130 100 112 2 111 100 130 100 112 2 120 2 101 0 
0 101 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 101 0 
0 105 100 108 2 113 2 111 100 100 100 100 100 112 2 113 2 107 100 106 0 
0 0 0 101 2 101 2 2 0 0 10 0 0 2 2 101 2 101 0 0 0 
111 100 100 106 2 105 112 2 107 112 1 111 108 2 111 106 2 105 100 100 112 
20 0 0 0 2 0 0 2 101 11 12 13 101 2 0 0 2 0 0 0 20 
111 133 100 112 2 111 112 2 105 100 100 100 106 2 111 112 2 111 100 133 112 
0 101 2 2 2 0 0 2 0 0 0 0 0 2 0 0 2 2 2 101 0 
0 101 2 120 2 107 112 2 111 100 100 100 112 2 111 108 2 120 2 101 0 
0 101 2 2 2 101 2 2 0 0 4 0 0 2 2 101 2 2 2 101 0 
0 105 133 112 2 110 2 111 100 100 133 100 100 112 2 110 2 111 133 106 0 
0 0 101 2 2 2 2 2 2 2 101 2 2 2 2 2 2 2 101 0 0 
0 0 101 2 111 112 2 111 108 2 101 2 107 112 2 111 112 2 101 0 0 
107 100 106 2 2 2 2 2 101 2 101 2 101 2 2 2 2 2 105 100 108 
101 2 2 2 111 100 112 2 110 2 110 2 110 2 111 100 112 2 2 2 101 
101 3 120 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 120 3 101 
101 2 2 2 107 100 100 100 100 108 0 107 100 100 100 100 108 2 2 2 101 
105 100 100 100 106 0 0 0 0 110 21 110 0 0 0 0 105 100 100 100 106 
# endleveldata 

は編集:私はそれが人を働かせました!問題は、私はこの関数を再度呼び出すコールバック関数を呼び出す必要があります。 user @ ACOMIT001のアドバイスに続いて、$ .get()の後に.then()関数を使用しました。私は$ get関数を抽出し、それを私のメインプログラムに入れ、.then()関数でloadLevel()を呼び出し、それが動作します。私は本当に理由を説明することはできませんが、これは今私のために働く。あなたの助けをお寄せいただきありがとうございます/

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-電話) – gyre

+0

私の答えがあなたの問題を解決したら、私の答えを受け入れたものとしてマークしてください。 – ACOMIT001

答えて

2

$に.getは非同期メソッドです。サーバーからの応答を待つのではなく、すぐに呼び出されます。なぜthis.mapが空になるのか?

はこのような何か試してみてください:前回の回答の状態としても

var that = this; 

$.get("1.txt", function(data){ 
    start = data.indexOf("0"); 
    end = data.lastIndexOf("#"); 
    that.map = data.slice(start, end - 2).split(" "); 
}, "text").then(function() { 
    console.log(that.map); 
}); 

を、この範囲が変化しています。

+0

非同期であるかどうかわかりませんでしたが意味がありますが、この回答はより完全です。 – Etienne