2011-07-13 9 views
4
私はグローバルスコープに変数を格納していない、私の下に示すラインの問題持っています

AJAX-応答データはグローバルスコープに保存されませんか?

var somedata; 

$.ajax({ 
    cache: false, 
    url: verification_url, 
    success: function(data){ 
     somedata = data; 
    } 
}); 

alert(somedata); // Undefined 

私が間違っているのは何を?私はこれを別の関数または何にラップする必要がありますか?

答えて

11

alert()コードが実行されてから応答が$.ajaxになる前に実行されます。

だからこそ、それはundefinedです。

var somedata; 

$.ajax({ 
    cache: false, 
    url: verification_url, 
    success: function(data){ 
     somedata = data; 

     alert(somedata); // 2. this will occur after the response is received 
    } 
}); 

alert(somedata); // 1. this will occur first 

アラートが順不同で発生していることがわかります。デフォルトでは、AJAXリクエストは後続のコードの実行を妨げません。

これは、コールバックメソッドを使用する目的全体です。これは、同期実行に頼るのではなく、適切なタイミングで呼び出されるメソッドです。

+0

それでは、適切な代替設計は何でしょうか? – Industrial

+1

@industrial:コールバックで 'somedata'を使うか、Ajaxリクエストが成功するまであなたのデザインに' somedata'に格納された情報が必要ないことを確認してください。 –

+0

成功コールバック関数にアラートを追加します。要求を行う前に関数を定義し、それをsuccess関数内で呼び出させることができます。いずれの方法でも、成功関数内で発生する必要があります。 (非同期で実行したい場合) – thescientist

5

AJAXは非同期です。それは略語でAの略です。あなただけの成功コールバックで結果にアクセスすることができます。

$.ajax({ 
    cache: false, 
    url: verification_url, 
    success: function(data){ 
     // HERE AND ONLY HERE YOU HAVE THE RESULTS 
     // So it is here that you should manipulate them 
     alert(data); 
    } 
}); 

// this line is executed MUCH BEFORE the success callback 
// and the server hasn't yet sent any response. 

だから結果を操作するために必要なすべてのコードは、成功コールバックの内側または成功コールバックから呼び出される関数内の場所でなければなりません。このパターンのグローバルな状態に頼るべきではありません。

+0

それほど真実ではなく、コールバックが実行された後にしかアクセスできません。 (somedataに返された結果が割り当てられていると仮定します) –

+1

@Brad Christie、これは真実ですが、AJAXリクエストがいつ完了するかわからないので、実用的なアプリケーションはありません。あなたが知っている唯一の場所は成功のコールバックです。したがって、私が答えて言ったように、それが結果が利用可能であることを確実に知ることができる唯一の場所です。他の場所はギャンブルになります。 –

+0

ギャンブル、真。しかし、成功したコールバックの後に 'somedata'の値を取得することは可能です。ギャンブルをしているかもしれませんが、私はちょうどそれをコールバックでアクセス可能な_only_、_impractical_ではないことを言いようとしていました。 –

関連する問題