質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

6回答

31588閲覧

Ajaxで取得したデータをグローバル変数にしたい

KayokoWatanabe

総合スコア14

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

4クリップ

投稿2015/08/06 02:57

どなたかわかる方がいたらご教示いただきたいです。

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

TetsuyaZama

総合スコア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
flat

総合スコア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

KiKiKi_KiKi

総合スコア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

Hiroshi_Honda

総合スコア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

hintrarou

総合スコア162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KayokoWatanabe

2015/08/06 09:32

回答いただきありがとうございます。 ご提示いただいた内容ではconsole.log(json);が空になってしまい 変数jsonに入ってこないようです。。。
eripong

2015/08/06 10:11

横から失礼します。 これで async : false, すれば動くのではと思いますが、 動いたとしてもお勧めしません。 そもそもなぜグローバル変数に入れたいのですか?
guest

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
Hiroshi_Honda

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KayokoWatanabe

2015/08/06 09:34

回答いただきありがとうございます。 ご提示いただいた内容ですとこの中のみでしかjsonデータを使用できません。 $.ajax~の外からjsonの情報を参照したいと考えております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問