どなたかわかる方がいたらご教示いただきたいです。
Ajaxで取得したデータをグローバル変数にして使用したいのですが
いくつか方法をためしましたがわかりませんでした。
async: false,
とすれば取得できるようですが非推奨のようでエラーになってしまいます。
json_data
をグローバル変数 jsonへ格納する方法がありましたら
ご教授いただけませんでしょうか。
どうぞよろしくお願いいたします。
$.ajax({ type: "GET", url: 'jsonファイル', dataType: 'json', cache: false, success: function(data) { var sheetsEntry = data.feed.entry; var json_data = sheetsEntry[0].gs$cell.$t; } });
var json = json_data;
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
eripongさんがおっしゃっている、「そもそもなぜグローバル変数に入れたいのですか?」
という質問が本質をついていらっしゃるように思います。
どうしても入れるのであれば、その後の処理はコールバックにした方が良いと思いますよ。
javascript
1var json=""; 2$.ajax({ 3 type: "GET", 4 url: 'jsonファイル', 5 dataType: 'json', 6 cache: false, 7 success: function(data) { 8 var sheetsEntry = data.feed.entry; 9 json = sheetsEntry[0].gs$cell.$t; 10 afterAjax(); 11 } 12 }); 13 14function afterAjax(){ 15 console.log(json); 16}
投稿2015/08/07 15:15
総合スコア216
0
回答ではないですが、解決に繋がるであろうページを見つけました。
ajaxでjsonを取得しグローバル変数へ格納(javascript ajax jquery) | nktmemo
JavascriptでAJAXで取得した値を変数にキャッシュして使う - 何度やっても同じ
追記
前述したリンク先にもある通り、setTimeout関数を利用して変数に値が入ったタイミングで実行という処理が出来る様です。
JavaScript
1// データを格納するための変数を宣言 2var json_data; 3$.ajax({ 4 type: 'GET', 5 url: 'json', 6 dataType: 'json', 7 cache: false, 8 success: function( data ) { 9 var sheetsEntry = data.feed.entry; 10 json_data = sheetsEntry[0].gs$cell.$t; 11 } 12}); 13 14setTimeout( function() { 15 // 変数 json_data の値がnullではない時 16 if( json_data != null ){ 17 // この中で変数 json_data を用いた処理を行う 18 console.log( json_data ); // JSONのデータを取得出来る 19 } else { // 変数 json_data の値がnullの時 20 // 100ms後に自身(無名関数)を再実行 21 setTimeout( arguments.callee, 100 ); 22 } 23}); 24 25console.log( json_data ); // undefined
また、コメントでeripongさんが仰っていますが、jQuery.ajaxの非同期オプションを無効にして同期リクエストを有効にする事でも取得出来ます。
そして、同じくeripongさんが仰っていますが、同期リクエストはその処理が完了するまでブラウザをロックしてしまい、ロックしている間は操作を一切受け付けなくなるのでお勧め出来ません。
JavaScript
1// データを格納するための変数を宣言 2var json_data; 3$.ajax({ 4 type: 'GET', 5 url: 'json', 6 dataType: 'json', 7 cache: false, 8 async: false, // 非同期オプションを無効にして同期リクエストを行う *1 9 success: function( data ) { 10 var sheetsEntry = data.feed.entry; 11 json_data = sheetsEntry[0].gs$cell.$t; 12 } 13 // *1 同期リクエストは処理が終わるまでブラウザをロックしてしまいます。 14}); 15 16console.log( json_data ); // JSONのデータを取得出来る
投稿2015/08/06 11:46
編集2015/08/07 03:19総合スコア617
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
他の方が回答していますように、なぜグローバル変数にしたいのか?と言う部分が少し引っかかります。
他のスクリプトファイルからjson
変数を使いたいとかでしょうか?
いずれにせよ、ajaxの非同期でjsonデータを取得しようとした場合、
jsonデータが取得できているかが担保するには、ajaxでの取得完了のスコープ内か、取得完了後のコールバック関数内から別のファイルにあるスクリプトの処理を呼び出すようにしなけれならないので、呼び出し元から引数で必要な部分を渡してしまえば良くなりますのでグローバル変数にする意味はあまりないのではないか思います。
あ、後ちょっと別件なのですが、私の記憶が確かならjQueryの1.8以上からは
success()
はdone()
error()
はfail()
complete()
はalways()
を使うことが推奨されていたかと思います。1.8以下なら関係のない話なのでスミマセンが...
javascript
1var json; 2$(function(){ 3 var jsonFilePath = 'jsonファイル'; 4 5 // jsonデータを取得した後に行いたい処理はこの関数内に記述するか、関数内から呼び出す。 6 var afterInit = function(jsonData) { 7 console.log('afterInit', jsonData); 8 /** 9 * この関数内に処理の呼び出しを書けばjsonはグローバル変数に入ったものが利用できるが、 10 * あえてjsonをグローバル変数にする意味が無いと思います。 11 * この後大きな処理をゴリゴリ記述しないのであれば、 12 * この関数に引数で渡してしまったものを使用すれば問題ないかと思います。 13 * 上のスコープに置くとしても 14 * $(funtion(){ 15 * var json; ... ここで十分ではないでしょうか。 16 */ 17 18 // 別ファイルにある何かの関数を呼び出す? 19 // fooFunc内で 変数 json を使用しても値が入っていることが保証できる 20 fooFunc(); 21 // が、呼び出し時にで引数で渡してしまえばOKなのでグローバル置く必要は必ずしもない。 22 barFunc(jsonData); 23 }; 24 25 var getJsonData = function(filePath) { 26 var defer = $.Deferred(); 27 $.ajax({ 28 type: 'GET', 29 url: filePath, 30 dataType: 'json', 31 cache: false 32 }) 33 .done(defer.resolve) 34 .fail(defer.reject); 35 return defer.promise(); 36 }; 37 38 var init = function() { 39 getJsonData(jsonFilePath) 40 .done(function(res) { 41 console.log('jsonデータがAjaxで取得できた', res); 42 var sheetsEntry = res.feed.entry; 43 afterInit(json = sheetsEntry[0].gs$cell.$t); 44 }) 45 .fail(function(jqXHR, statusText, errorThrown) { 46 console.log('初期化失敗', jqXHR, statusText, errorThrown); 47 // jsonの取得に失敗した時の処理 48 // 1秒置いて再取得試みるとか? 49 setTimeout(function() { 50 init(); 51 }, 1000); 52 }); 53 }; 54 init(); 55});
コメント部分が長くて申し訳ないですm__m
投稿2015/08/11 15:34
総合スコア596
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
json変数をajaxより先に定義してsuccessの部分からvarを取って実行したらできないでしょうか?
今すぐ、試せる環境がないため確認はできていません。
var json = '';
$.ajax({
type: "GET",
url: 'jsonファイル',
dataType: 'json',
cache: false,
success: function(data) {
var sheetsEntry = data.feed.entry;
var json_data = sheetsEntry[0].gs$cell.$t;
json = json_data;
} });
投稿2015/08/06 16:09
総合スコア35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
単純にこれはだめですか?
var json = ’’;
$.ajax({ type: "GET", url: 'jsonファイル', dataType: 'json', cache: false, success: function(data) { var sheetsEntry = data.feed.entry; json = sheetsEntry[0].gs$cell.$t; } });
console.log(json);
投稿2015/08/06 07:39
総合スコア162
0
もしかして、$.ajaxを呼び出したあと
var json = json_data;
にすぐにデータが挿入されていることを想定されていますでしょうか
以下のコードでURLのファイルを呼び出しますが、successの部分は読み出しが完了した時に呼ばれますので、json変数にjson_dataの値を代入したい場合は、以下のようにsuccessの部分で値を代入しないとおそらくご提示されたコードでは、値が何も入らないのではないでしょうか
外していたらごめんなさい
$.ajax({
type: "GET",
url: 'jsonファイル',
dataType: 'json',
cache: false,
success: function(data) {
var sheetsEntry = data.feed.entry;
var json_data = sheetsEntry[0].gs$cell.$t;
var json = json_data;
} });
投稿2015/08/06 03:53
編集2015/08/06 03:54総合スコア35
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/06 09:34
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。