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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1330閲覧

exif.jsのEXIF.getData(img,function(){})内のローカル変数をグローバルでも使用したい。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2017/08/24 12:56

編集2017/08/25 05:24

exif.jsのEXIF.getData(img,function(){})内のローカル変数をグローバルでも使用したい。
コールバック関数内のローカル変数のため外で使用できないのは分かるのですが、
グローバルでうまく参照できません。

###該当のソースコード
jQuery

EXIF.getData(img, function () {
var orientation = EXIF.getAllTags(this).Orientation;
});
console.log(orientation); //変数がありませんとなる。

###補足情報(言語/FW/ツール等のバージョンなど)
https://github.com/exif-js/exif-js.git

###下記にて解決しました!!
EXIF.getData(fileData, function(){
var orientation = EXIF.getTag(fileData, "Orientation");

var fd = new FormData($('#test').get(0));

~~~ 変数:orientationを含めた処理 ~~~

$.ajax({ url: type: 'post' data: fd

~~~ その後の処理 ~~~

});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答2

0

ベストアンサー

非同期処理、コールバックの考え方が間違っています。
まずは非同期処理というものを知る必要があります。
EXIF.getDataが、コンピュータに何を指示しているかざっくり説明致しますと、
「画像情報の読み込みが完了したら、あとでコールバック関数を実行してね」というもので、
関数としてはすぐに終了し、次のステップconsole.log行へ進みます。

orientationの初期化は後で実行することになっているので、
console.logでorientationを出力しようとしても、
まだ初期化されておらず、そこで初めての登場→エラーとなります。
※追記 data URIでの画像は同期処理で書かれているっぽいので希望の動作になる可能性があります。未確認です><
※更に追記 そもそもfunctionブロック内でvarしてるのでグローバルに代入は無理でした。失礼しました。

解決策は関数の中に処理を書いていってください。
コールバック関数の中から次の処理の関数をコールし、どんどん関数で処理を繋げていきます。
すると立派なコールバック地獄と呼ばれるコードが出来上がるはずです。

そんなコールバック地獄にヤバさを感じたらOKです!
「js コールバック」でググると非同期処理を同期処理っぽく書こう!といった記事が沢山でてきますので、どれも参考になると思います。まずは非同期処理と同期処理について知ってください。
なぜjsが非同期処理でやらないといけないのか、というのも知れると思います。
頑張ってください。

投稿2017/08/24 17:43

編集2017/08/25 00:58
so87

総合スコア764

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

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

退会済みユーザー

退会済みユーザー

2017/08/25 05:16

回答ありがとうございます! コールバック地獄にして、変数(orientation)を使用する事で解決いたしました。 可読性が悪くなった感じになりましたが、ネストが少なめのコード量だったため、 今回はこれで対応いたします!! 非同期処理と同期処理、Promiseの活用等 覚えることや勉強しなくてはいけないことが見えて、とても助かりました!! ご丁寧なアドバイス、ありがとうございました。
guest

0

単純にこれだと駄目ですかね??

var orientation;

EXIF.getData(img, function () {
orientation = EXIF.getAllTags(this).Orientation;
});
console.log(orientation);

投稿2017/08/24 16:39

kmifa

総合スコア39

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

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

退会済みユーザー

退会済みユーザー

2017/08/25 01:37

回答ありがとうございます! console.log()の結果がundefinedとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問