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

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

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

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

Q&A

1回答

4343閲覧

WebSQL DBから抽出したデータを返したい 非同期を同期処理

phone0125

総合スコア40

JavaScript

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

0グッド

0クリップ

投稿2015/11/16 11:40

編集2022/01/12 10:55

ハイブリッドアプリ JavaScriptでWebSQLを使用してDBを構築しています.
メインメソッドからsearch(condition)を呼び出し,テーブルtbl1内から条件に合うレコードを抽出し,そのデータを格納した配列を返そうにしています.

ところが,以下のように記述した場合,
transactionは非同期に実行されるようで,データが格納されないままreturnされてしまいます.

JavaScript

1function search(condition) { 2 // search in DataBase 3 var resultData = new Array; 4 5 var params = [condition]; 6 7 var db = openDatabase('appdb', '', '', 1 * 1024 * 1024); 8 db.readTransaction(function (transaction) { 9 transaction.executeSql("SELECT id, name, serv FROM tbl1 WHERE serv LIKE ? ", params, 10 function(transaction, result) { 11 for (var i = 0; i < result.rows.length; i++) 12 resultData.push(result.rows.item(i)); 13 }, function() { 14 alert("DB SELECT Error!"); 15 }); 16 }); 17 18 return resultData; 19}

また,以下のように,transaction成功時のデータ格納処理が終了した後にreturn文を記述すると,返り値なしで(バックグラウンドでtransactionは動いたまま)サブメソッドが終了してしまいます.

JavaScript

1 db.readTransaction(function (transaction) { 2 transaction.executeSql("SELECT id, name, serv FROM tbl1 WHERE serv LIKE ? ", params, 3 function(transaction, result) { 4 for (var i = 0; i < result.rows.length; i++) 5 resultData.push(result.rows.item(i)); 6 return resultData; 7 8 }, function() { 9 alert("DB SELECT Error!"); 10 }); 11 });

どのようにすれば,期待通りの動作が得られるのでしょうか?
よろしくお願いいたします.

~ 補足 ~
こちらを参考に,deferredを使用して同期的処理を試してみましたが,うまくいきませんでした.

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

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

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

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

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

guest

回答1

0

WebSQL DB を詳しく知らないですが、コメントします。

return 文にて元の関数へ結果を返却するのは、性質上無理だと思われます。
(SQL実行処理はご存じのとおり別プロセスで制御していますので。。。)

呼び出し元の関数にてSQL結果を受け取るのではなく、SQL結果を受け取り処理を行う、新たな関数を用意するのがベターじゃないでしょうか。(もしくは一つ目の関数にて、呼び出し元からコールバック関数を渡すとか・・・)

Javascript

1// SQL結果から行う処理を記載 2function sqlResult(result) { 3 console.log(result); 4} 5 6function search(condition) { 7 // search in DataBase 8 var resultData = new Array; 9 10 var params = [condition]; 11 12 var db = openDatabase('appdb', '', '', 1 * 1024 * 1024); 13 db.readTransaction(function (transaction) { 14 transaction.executeSql("SELECT id, name, serv FROM tbl1 WHERE serv LIKE ? ", params, 15 function(transaction, result) { 16 for (var i = 0; i < result.rows.length; i++) 17 resultData.push(result.rows.item(i)); 18 sqlResult(resultData); // 処理結果は新しい関数で対応 19 }, function() { 20 alert("DB SELECT Error!"); 21 }); 22 }); 23 24 return resultData; 25}

投稿2015/11/16 23:48

usk

総合スコア397

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

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

phone0125

2015/11/17 08:23

ありがとうございます. やはりその方法が妥当ですよね. サブ関数の再利用性が低くなる点が残念です...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問