ハイブリッドアプリ 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を使用して同期的処理を試してみましたが,うまくいきませんでした.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/17 08:23