微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript – 改进AngularJS Simple Factory – 围绕PhoneGap Storage API的包装器

我正在尝试用我一般的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回调.或者我应该以某种方式更好地重构一切?你怎么看?

解决方法:

http://rburns.paiges.net/about/以下:

function getCategories(){
  return promisedQuery('SELECT * FROM CATEGORIES', defaultResultHandler, defaultErrorHandler);
}

function getdishes(){
  return promisedQuery('SELECT * FROM disHES', defaultResultHandler, defaultErrorHandler);
}

function defaultResultHandler(deferred) {
  return function(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);  
  }  
}

function defaultErrorHandler(err) {
  alert("Error processing sql: " + err.code);
}

function promisedQuery(query, successCB, errorCB) {
  var deferred = $q.defer();
  db.transaction(function(tx){
    tx.executesql(query, [], successCB(deferred), errorCB);      
  }, errorCB);
  return deferred.promise;  
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐