私はまあまあの JS スキルを使って AngularJS で「いい」ことをしようとしています。
angular.module('App').factory("SQLService", function ($q) {
var db = window.openDatabase("FOOD_DATABASE", app.current_version, "FOOD_DATABASE_DN", 5 * 1024 * 1024);
// public methods
function getCategories(){
deferred = $q.defer();
db.transaction(queryDB, errorCB);
function queryDB(tx) {
tx.executeSql('SELECT * FROM CATEGORIES', [], querySelectSuccess, errorCB);
}
return deferred.promise;
}
function getDishes(){
deferred = $q.defer();
db.transaction(queryDB, errorCB);
function queryDB(tx) {
tx.executeSql('SELECT * FROM DISHES', [], querySelectSuccess, errorCB);
}
return deferred.promise;
}
// something like private methods
function errorCB(err) {
alert("Error processing SQL: " + err.code);
}
function querySelectSuccess(tx, results) {
var len = results.rows.length;
var output_results = [];
for (var i=0; i<len; i++){
output_results.push(results.rows.item(i));
}
deferred.resolve(output_results);
}
//expose object with public methods
return {
getCategories: getCategories,
getDishes: getDishes,
};
});
私が気に入らない最初のことは、各パブリック関数でグローバルdeferred = $q.defer();
を作成することです。それをローカルとして宣言すると、そのdefferedオブジェクトを追加のパラメーターとしてquerySelectSuccessコールバックに渡す方法がわかりません。または、何らかの方法ですべてをリファクタリングする必要がありますか? あなたの意見は何ですか?