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

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

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

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

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

jQuery

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

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

3回答

9077閲覧

繰り返し処理の最後に関数を実行させたい

agepan

総合スコア66

Cordova

Cordovaは様々なデバイスで使うことができるオープンソースなモバイル用開発プラットフォームです。開発者に各デバイスの元のプラットフォームで開発する必要をなくし、HTML・JavaScript・CSSなどの一般的なウェブのテクノロジーを使ってすべてのデバイスで展開することができるモバイルのアプリケーションを生成することを可能にします。

JavaScript

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

jQuery

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

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

0グッド

0クリップ

投稿2017/09/19 01:58

Monacaを利用してiPhoneで画像を取り込むJavaScriptコードを書いています。
現在のところ以下のようなコードになっていまして、画像の取り込みに成功しております。

画像の取り込みが完了したら次の関数(nextStep())を1回実行させたいと思い、下記コード内の現在コメントアウトにしている部分に記述したのですが、この場合ですと画像を10枚取り込むと10回実行されてしまいます。

画像を10枚取り込む操作をしたとき、最後の10枚目の処理後にnextStep()を1回だけ実行させるようなコードにしたいのですが、どのようにコードを修正すると実現するでしょうか?

よろしくお願いいたします。

// 画像を取得する function getImage() { try{ window.imagePicker.getPictures( function(results) { var content = ''; for (var i = 0; i < results.length; i++) { camera_success(results[i]); // カメラ起動成功時camera_successを実行 } }, function (error) { alert('Error: ' + error); }, { title: '画像を選択', width: 1000, height: 1000, } ); } catch(e){ alert(e); } } // カメラ起動時 function camera_success(results) { window.resolveLocalFileSystemURL( results, resolve_success, file_error ); } function resolve_success(entry) { var fileExtension = entry.name; fileExtension = fileExtension.split('.'); fileExtension = fileExtension[fileExtension.length-1].toLowerCase(); var randomNumber = Math.floor( Math.random() * 99999 ); // 99999までのランダムな整数(乱数)を生成 randomNumber = ( '00000' + randomNumber ).slice( -5 ); var d = new Date(); var n = d.getTime(); var newFileName = 'image_' + n + '_' + randomNumber + '.' + fileExtension; var myFolderApp = 'myFolder'; window.requestFileSystem( LocalFileSystem.PERSISTENT, 0, function( fileSys ) { fileSys.root.getDirectory( myFolderApp, {create: true, exclusive: false}, function( directory ) { entry.copyTo( directory, newFileName, function move_success(entry) { var result = '<img src="' + myFolderApp + '/' + newFileName + '">'; // IMGタグを作成 $(result).prependTo('.preview'); // HTMLに挿入 // ★★★ ここに次に実行させる関数nextStep()を書くと、10枚取り込んだとき10回実行されてしまう ★★★ } , file_error ); }, file_error ); }, file_error ); } function file_error(error) { alert('File System Error:' + error.code); } function camera_error(message) { alert('Camera Error:' + message); }

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

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

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

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

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

guest

回答3

0

ベストアンサー

本来はkei344さんやyambejpさんが提示されているPromiseなどを使った処理を行うべきです。
が、とりあえず期待する動作をさせたい、というのであれば以下のように処理する画像の件数を取得し、画像の数と処理件数が一緒になったら、希望の処理をするとかいう乱暴なやり方はあります。

javascript

1// 追加 2var imageLength = 0; 3var length; 4 5// 画像を取得する 6function getImage() { 7 try{ 8 window.imagePicker.getPictures( 9 function(results) { 10 var content = ''; 11 12 // 追加 13 var imageLength = results.length; 14 var length = 0; 15 16 for (var i = 0; i < results.length; i++) { 17 camera_success(results[i]); // カメラ起動成功時camera_successを実行 18 } 19 }, function (error) { 20 alert('Error: ' + error); 21 }, { 22 title: '画像を選択', 23 width: 1000, 24 height: 1000, 25 } 26 ); 27 } catch(e){ 28 alert(e); 29 } 30} 31 32 33 34// カメラ起動時 35 36function camera_success(results) { 37 window.resolveLocalFileSystemURL( results, resolve_success, file_error ); 38} 39 40function resolve_success(entry) { 41 42 var fileExtension = entry.name; 43 fileExtension = fileExtension.split('.'); 44 fileExtension = fileExtension[fileExtension.length-1].toLowerCase(); 45 46 var randomNumber = Math.floor( Math.random() * 99999 ); // 99999までのランダムな整数(乱数)を生成 47 randomNumber = ( '00000' + randomNumber ).slice( -5 ); 48 49 var d = new Date(); 50 var n = d.getTime(); 51 var newFileName = 'image_' + n + '_' + randomNumber + '.' + fileExtension; 52 var myFolderApp = 'myFolder'; 53 54 55 window.requestFileSystem( LocalFileSystem.PERSISTENT, 0, function( fileSys ) { 56 fileSys.root.getDirectory( myFolderApp, 57 {create: true, exclusive: false}, 58 function( directory ) { 59 entry.copyTo( directory, newFileName, 60 61 function move_success(entry) { 62 63 var result = '<img src="' + myFolderApp + '/' + newFileName + '">'; // IMGタグを作成 64 $(result).prependTo('.preview'); // HTMLに挿入 65 66 // 追加 67 length += 1; 68 if (imageLength === length) { 69 // ★★★ ここに次に実行させる関数nextStep()を書くと、10枚取り込んだとき10回実行されてしまう ★★★ 70 } 71 } , 72 73 file_error ); 74 }, 75 file_error ); 76 }, 77 file_error ); 78} 79 80function file_error(error) { 81 alert('File System Error:' + error.code); 82} 83 84function camera_error(message) { 85 alert('Camera Error:' + message); 86}

投稿2017/09/19 07:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

agepan

2017/09/19 12:03

ご回答ありがとうございました! こちらのコードを参考にしまして、取得画像総数をsessionStorageに保存し、for文とif文を使って画像総数と一致したとき=10枚取得したときに10枚目が処理されたときに関数を実行するコードを書きまして、きちんと動作しております。コード的にはスマートではないかもしれませんが、目的は達成することができました。 ありがとうございました!
guest

0

グローバル変数に回数を記録して分岐するか、Promiseを使うかどちらかだと思います。

【Promise - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise

【JavaScript Promiseの本】
http://azu.github.io/promises-book/

【今更だけどPromise入門 - Qiita】
http://qiita.com/koki_cheese/items/c559da338a3d307c9d88

【Promiseについて0から勉強してみた - Qiita】
http://qiita.com/toshihirock/items/e49b66f8685a8510bd76

【AngularJS で Promise (defer)を使ってファイルシステムからファイルを読み込む (cordova filesystem) - Qiita】
http://qiita.com/mm36/items/a9869a2066ace1aed0a8

投稿2017/09/19 02:17

kei344

総合スコア69407

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

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

agepan

2017/09/19 12:12

ご回答ありがとうございます! Promiseという方法は初めて知りました。ただ自分のJavaScript技量が追いついていなく…きちんと理解するには時間が掛かりそうなので、取り急ぎsessionStorageとfor文、if文を用いて取得画像数と処理数が一致したとき(最終の画像を処理したとき)関数を実行するコードを書きまして、動いております。ただコード的にはPromiseなどを用いる方が正しいとのことですので、これからじっくりと学びたいと思います。ご回答頂き誠にありがとうございました!
guest

0

一部jQueryで処理しているのでしょうか?
非同期の処理を実装したいなら$.whenや$.Deferredで対応してもいいかもしれません。

投稿2017/09/19 02:24

yambejp

総合スコア114839

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

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

agepan

2017/09/19 12:06

ご回答ありがとうございました! $.whenという方法を用いてみましたが、途中でエラーになってしまいました(多分にこちらで書いたコードの問題であると思います)。ただ$.whenという方法は後にすぐ役立ちそうで、とても勉強になる情報でありましたのでメモして保存致しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問