0

イオン フレームワークと角度のある js と ngCordova に基づいて、モバイル ハイブリッド アプリを開発しています。そして、私はそれに慣れていません。データベースを操作するために SQLite プラグインを使用しています。

次のコードがあります

service.js

angular.module('imrapp.services', ['imrapp.config'])
.factory('DB', function(DB_CONFIG, $cordovaSQLite) {
    var self = this;
    self.db = null;


    self.firstRunTest = function() {
        if (window.cordova) {

            self.db = cordovaSQLite.openDB({
                name: DB_CONFIG.name
            }); //device
        } else {
            self.db = window.openDatabase(DB_CONFIG.name, '1.0', 'database', -1); // browser
        }
        return $cordovaSQLite.execute(self.db, 'SELECT name FROM sqlite_master WHERE type=(?) AND name=(?)', ['table', 'sync_table'])
            .then(function(result) {
                if (result.rows.length > 0) {
                    console.log(result.rows.item(0).name);
                    return result.rows.item(0).name;
                } else {
                    return "No results found";
                }
            }, function(err) {
                alert(err);
                console.error(err);
            });
    }
    return self;
})

controllers.js

angular.module('imrapp.controllers', [])

.controller('LoginCtrl', function($scope, DB) { //AuthInterceptor,
    $scope.data = {};

    $scope.login = function() {

         var firstRun = DB.firstRunTest();
        console.warn("IS FIRST RUN 2 = " + JSON.stringify(firstRun));

    }
});

を呼び出すDB.firstRunTestと、コントローラーから。期待される戻り値はの値ですresult.rows.item(0).nameが、オブジェクトを返します {"$$state":{"status":0}}

メソッド DB.firstRunTest() で
console.log(result.rows.item(0).name);意図した値が得られるため、クエリは問題なく実行されます。

私が間違っているところで、誰かが私を助けてくれます。ありがとう

4

1 に答える 1

0

問題は、非同期関数を呼び出しているため、「return self;」の後でも応答が最後に行われることです。そのため、関数に入ったときと常に同じになります。非同期呼び出しを処理するには、promise を使用する必要があります。まずはお電話

var firstRun = DB.firstRunTest();

次のようにする必要があります。

DB.firstRunTest().then(function(returned) {
    firstRun = returned;
})

別のオプションは、エラーをキャッチすることです。

DB.firstRunTest().then(function(returned) {
    firstRun = returned;
}, function(error) {
//Do what you want with the error
})

次に、説明にもっと単純な関数を使用しました。必要に応じて自分自身を定義する必要があります。

.factory('DB', function(DB_CONFIG, $cordovaSQLite, $q) {
                var def = $q.defer(); //Create promise

               $cordovaSQLite.execute(db, 'SELECT name FROM sqlite_master WHERE type=(?) AND name=(?)', ['table', 'sync_table'])
                        .then(function(result) {
                            def.resolve(result)/*Here you should put what you want to be in "returned" 
        I suggest to put an object. I face problems everytime I resolve a simple var.*/
                        }, function(err) {
                            alert(err);
                            console.error(err);
                            def.reject(err)//Here you should put what you want to return as "error" 
                        });
                }
            return def.promise;/*The promise will be returned asyncronously so it wouldn't be return till all the asyncronous function will be resolve. 
    If you have 2 asyncronous functions but you use the "promise.resolve()" in the first one, promise data will be catch so the second function won't return anything, so be care of "resolve" just what you need.*/
        })

私が自分で悪いことを説明した場合は、聞いてください。より良い説明を試みます:P

于 2015-10-08T10:20:27.183 に答える