2017-07-11 21 views
1

これは何度も尋ねられたことがわかっていますが、問題を把握することはできません。限り、私は知っているように、あなたはJavaScript内の関数内のグローバル変数を変更することができます。それは私にとってはうまくいかない。グローバル変数をajaxリクエストから変更する

var lastMessage = 0; 
function loadChat() { 
$.post("/lastmessage", { roomid: roomId }) 
    .done(function(data) { 
     var response = JSON.parse(data); 
     if (response.state == "success") { 
      lastMessage = response.message; 
      console.log("Inside: " + lastMessage); 
     } 
    }); 
} 

console.log("Outside: " + lastMessage); 

これは私

Outside: 0 
Inside: 17 

内の値が正しいことになります、外ではありません。何が問題になる可能性がありますか?

+0

'lastMessage'は実際には変更されていますが、2番目のログはajaxコールバックの前に実行されています。' lastMessage'の新しい値に基づいて何かを実行する必要がある場合は、 'lastMessage'を'ログ( '内部') ' – smarber

答えて

3

これは非同期なので、外部から呼び出すとまだ実行が完了していません。これが意味することは、ポストはポストが非同期であることから、待たずに実行を継続します

.done(function(data) { 
     var response = JSON.parse(data); 
     if (response.state == "success") { 
      lastMessage = response.message; 
      console.log("Inside: " + lastMessage); 
     } 
    }); 

が、console.log("Outside: " + lastMessage);を完了した後、あなたのコードのこの部分のみが到達していることです。

あなたが価値あなたを取得した後に発生するために何かをしたい場合は、一つの選択肢は、次のような、コールバック関数を使用することです:あなたが最初のログが2番目のログ後に印刷されたことに気づいたかもしれません

function printMessage(message) { 
    console.log(message) 
} 

function loadChat(callback) { 
$.post("/lastmessage", { roomid: roomId }) 
    .done(function(data) { 
     var response = JSON.parse(data); 
     if (response.state == "success") { 
      lastMessage = response.message; 
      callback(lastMessage); 
     } 
    }); 
} 

loadChat(printMessage); 
関連する問題