Ionic ngCordova SQLite执行方法 - 控制应该在'之后返回'叫做

时间:2015-09-25 03:23:11

标签: sqlite ionic ngcordova

我有一个功能 ' insertAllLinksFunc' -it在数据库中插入数据。 当在' insertAllLinksFunc'内部调用execute方法时,控件在'之前返回'方法完成。我希望控件只能在'然后'之后返回。方法已经完成。

这是日志:

            8     697189   log      test : inside test              
            9     697193   log      insertAllLinksFunc : inside insertAllLinks : arr length=1               
            10    697195   log      insertAllLinksFunc : ret=               
            11    697196   log      test : arr0=                
            12    697197   log      test : exitting test                
            13    697206   log      insertAllLinksFunc : item=LinkEntity[linkId=1443150697190, title=title-1443150697190, imgPath=imgPath-1443150697190]

我想要的是log 13中的代码应该在log 9和log 10

的代码之间执行

代码:

myController.js

            var db=null;
            var myModule = angular.module('MyController', ['ionic', 'ngCordova'])
            .run(function($ionicPlatform, $cordovaSQLite) {
              $ionicPlatform.ready(function() {
                console.log('inside onReady');
                db = $cordovaSQLite.openDB("my.db");

                $cordovaSQLite.execute(db, "create table if not exists POSTS_TBL( POST_ID numeric primary key , CREATE_DT text not null, POST_TYPE text not null, TH_LOCAL_IMG_PATH text , TH_SERVER_IMG_PATH text , LINK_URL text , TITLE text , CAPTION text , MESSAGE text , DESCRIPTION text , LOCAL_IMG_PATH text , SERVER_IMG_PATH text , POST_JSON text not null)");
                console.log('exitting onReady, db='+db);
              });
            })

            .factory('queryFactory', function($cordovaSQLite){

insertAllLinksFunc = function(arr){
    console.log('insertAllLinksFunc : inside insertAllLinks : arr length='+arr.length);
    var ret = null;
    if(arr.length>0){
        var query = "INSERT INTO POSTS_TBL (POST_ID, TITLE, CAPTION, POST_JSON, DESCRIPTION, MESSAGE, SERVER_IMG_PATH, LINK_URL, CREATE_DT, POST_TYPE) VALUES (?,?,?,?,?,?,?,?,?,?)";

        var ret = [];
        for(item in arr){
            console.log('insertAllLinksFunc : item='+arr[item].toString());
            $cordovaSQLite.execute(db, query, [arr[item].linkId, arr[item].title, arr[item].caption, arr[item].linkJSON, arr[item].description, arr[item].msg, arr[item].serverPath, arr[item].url, arr[item].createDt, Settings.POST_TYPE_LINK]).then(function(res) {
            console.log("insertAllLinksFunc : insertAllLinksFunc : INSERT ID -> " + res.insertId);
            ret.push(res);
            }, function (err) {
                console.error(err);
                return -1;
            });

        }
        console.log('insertAllLinksFunc : ret=' + ret);
        return ret;
    }
}
            return {
                insertAllLinks : insertAllLinksFunc
            }})

app.js

            angular.module('starter', ['ionic', 'ngCordova', 'MyController'])
            .controller('myCtrl', function($scope, queryFactory){
              $scope.test = function(){
                console.log('test : inside test');    
                var time = new Date().getTime();
                var entity = new LinkEntity(time, 'title-'+time, 'imgPath-'+time, 'serverPath'+time, '{}', 'url', 'caption', 'description', time, 'msg');
                var arr = [entity];
                var arr0 = queryFactory.insertAllLinks(arr);
                console.log('test : arr0='+arr0);
                console.log('test : exitting test');
              }  
            });

entities.js

            function LinkEntity(linkId, title, imgPath, serverPath, linkJSON, url, caption, description, createDt, msg){
                this.linkId = linkId;
                this.title = title;
                this.imgPath = imgPath;
                this.serverPath = serverPath;
                this.linkJSON = linkJSON;
                this.url = url;
                this.caption = caption;
                this.description = description;
                this.createDt = createDt;
                this.msg = msg;
            }

            LinkEntity.prototype.toString = function(){
                return 'LinkEntity[linkId='+ this.linkId +', title='+this.title+', imgPath='+this.imgPath+']';
            }

1 个答案:

答案 0 :(得分:1)

sql lite函数$ cordovaSQLite.execute是一个辅助函数。这意味着在调用函数并插入数据时,应用程序将继续工作。如果数据已插入" .then()"叫做。所以.then()中的所有代码都会在稍后调用,而你的应用程序已经编写了第9行和第9行。 10。

要了解问题,您需要查看:AngularJS $q and promises

在您的情况下,您遇到了使用多个承诺的问题。为此,您可以收集数组中的promise并使用$ q.all:combining promisesstackoverflow: how-to-chain-multiple-promises-within-and-after-a-for-loop。但我会假设,如果你理解如何使用$ q和承诺你将得到主要问题。