AngularJS选择检查数据并插入

时间:2015-02-01 03:57:54

标签: javascript angularjs

我是新手。我尝试使用离子框架进行练习,因此将使用angularjs。我有点问题。我想在插入数据之前检查这些数据是否存在,如果不存在则会插入新数据。

在这个方法getContent.then(function(res){})上,我将检查此返回res.length,如果等于0,我想要插入此数据。当我运行时,将执行此控制台,obj有数据。但最后,我想获取所有数据,但数据是空的。

但我发现如果我在getContent.then(function(res){})之外删除此插入方法,它就可以正常工作。我不知道如何解决这个问题并导致这个原因。

谢谢你的帮助。

这是我的控制器代码

angular.module('starter.controllers', ['sqlite.services'])
.controller('TestCtrl', function($scope, $http, Tests, SQLService) {
  SQLService.setup();
  var new_tests = new Array();

  $http.get('https://XXXXX').then(function(response){
    var datas = response.data;
    for (data_ in datas) {
      var obj = {
        id: datas[data_].content_id,
        title: datas[data_].title,
        url: datas[data_].url,
        content: datas[data_].content
      };

      var getContent = SQLService.get_one(obj.id);
      getContent.then(function(res) {
        console.log('res ' , res);
        console.log('res ' , res.length); // length get 0

        if(res.length == 0) {
          console.log('insert obj ' , obj);
          console.log('SQLService ' , SQLService);
          SQLService.insert(obj);
        }
        else if (res.length == 1) {
          console.log('edit obj ' , obj);
        }
      });

      // SQLService.insert(obj); // If I write insert code here is work for me

      new_tests.push(obj);
    }
  })
  .finally(function() {
    SQLService.all().then(function (results) {
      $scope.tests = results;
      console.log('results ' , results);
    });
  });

这是我的sql_service.js

angular.module('sqlite.services', [])
.factory('SQLService', function($q) {
  var db;

  function createDB() {
    try {
      if (window.cordova) {
        $cordovaSQLite.deleteDB("my.db");
        db = $cordovaSQLite.openDB({name: 'my.db'}); // device
      }
      else{
        db = window.openDatabase("my.db", '1', 'my', 1024 * 1024 * 100); // browser
      }

      db.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS pixnet (id integer not null primary key autoincrement, content_id text, title text, url, text, content text)", []);
      });
    }
    catch(err) {
      console.log('Error processing SQL: ' + err);
    }

    console.log('database created');
  }

  function insertNewContent(newContent) {
    console.log('--insert--');
    return promisedQuery("INSERT INTO pixnet (content_id, title, url, content) VALUES ('" + newContent.id + "', '" + newContent.title + "', '" + newContent.url + "', '" + newContent.content + "')", defaultResultHandler, defaultErrorHandler);
  }

  function getContents() {
    return promisedQuery("SELECT * FROM pixnet", defaultResultHandler, defaultErrorHandler);
  }

  function updateContent(content){
    console.log('update content ' , content);
    return promisedQuery("UPDATE pixnet SET title='" + content.title + "', content='" + content.content + "' WHERE content_id = '" + content.id + "'", defaultResultHandler, defaultErrorHandler);
  }

  function getContent(content_id) {
    return promisedQuery("SELECT * FROM pixnet WHERE content_id = '" + content_id + "'", defaultResultHandler, defaultErrorHandler);
  }

  function defaultResultHandler(deferred) {
    return function(tx, results) {
    console.log('defaultResultHandler results ' , results);
    var len = results.rows.length;
    var output_results = [];

    for (var i=0; i<len; i++){
      var t = {
        'id': results.rows.item(i).id,
        'content_id': results.rows.item(i).content_id,
        'title': results.rows.item(i).title,
        'url': results.rows.item(i).url,
        'content': results.rows.item(i).content
      };
      output_results.push(t);
    }

    deferred.resolve(output_results);
    }
  }

  function defaultErrorHandler(deferred) {
    return function(tx, results) {
    var len = 0;
    var output_results = '';
    deferred.resolve(output_results);
    }
  }

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

  return {
    setup: function() {
      return createDB();
    },
    insert: function(content) {
      return insertNewContent(content);
    },
    edit: function(content) {
      return updateContent(content);
    },
    get_one: function(content_id) {
      return getContent(content_id);
    },
    all: function() {
      return getContents();
    }
  }
});

2 个答案:

答案 0 :(得分:0)

我相信正在发生的事情是“延迟”#39;你在promiseQuery中创建永远不会解决:

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

由于您正在使用cordova s​​qlite插件,查看源代码,我们会看到&#39;事务的第三个参数&#39;功能是成功的回调。

https://github.com/brodysoft/Cordova-SQLitePlugin/blob/master/www/SQLitePlugin.js#L74

所以这意味着您希望在这些回调中解决您的承诺。请尝试以下方法:

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

将deferred.resolve函数传递给成功回调(事务的最后一个参数)将在事务结束时调用它。

答案 1 :(得分:0)

&#13;
&#13;
    angular.module('starter.controllers', ['sqlite.services'])
      .controller('TestCtrl', function($scope, $http, Tests, SQLService) {
          SQLService.setup();
          var new_tests = new Array();

          var call_async_in_loop = function(obj) {
            var getContent = SQLService.get_one(obj.id);
            getContent.then(function(res) {
              console.log('res ', res);
              console.log('res ', res.length); // length get 0

              if (res.length == 0) {
                console.log('insert obj ', obj);
                console.log('SQLService ', SQLService);
                SQLService.insert(obj);
              } else if (res.length == 1) {
                console.log('edit obj ', obj);
              }
            });

          }

          $http.get('https://XXXXX').then(function(response) {
              var datas = response.data;
              for (data_ in datas) {
                var obj = {
                  id: datas[data_].content_id,
                  title: datas[data_].title,
                  url: datas[data_].url,
                  content: datas[data_].content
                };

                call_async_in_loop(obj)
                new_tests.push(obj);
              }
            })
            .finally(function() {
              SQLService.all().then(function(results) {
                $scope.tests = results;
                console.log('results ', results);
              });
            });
&#13;
&#13;
&#13;

由于异步调用SQLService.get_one(obj.id),您丢失了对obj的引用。当promise被解决时,for循环已经完成。所以你必须创建一个闭包以保持对obj的引用。