2016-11-15 70 views
0

我有一個用AngularJS開發的Cordova跨平臺應用程序,它實現了SQLite數據庫。這個想法是,用戶可以登錄,他們的詳細信息將被存儲在SQLite數據庫中以供離線訪問(例如,記住我的功能)。

在登錄屏幕上,我運行一個查詢,在應用程序啓動後立即檢查SQLite表中是否有值。然後根據表中是否有值,我會顯示登錄確認屏幕要求用戶輸入他們的詳細信息。

數據庫按預期工作,我可以保存並讀取詳細信息。但是,因爲數據庫異步處理調用,所以無法向用戶顯示正確的用戶界面。

在我的登錄視圖中,我有一個變量來保存布爾值,無論SQLite表是否包含值。但是,變量始終爲爲空/空,因爲異步調用在變量初始化後響應。

我試圖執行$ q來初始化異步調用完成後的變量,但我遇到了實現的麻煩。

我的看法控制器,如下所示:

控制器

var login = angular.module("loginController", []); 
login.controller("LoginController", function ($scope, $q, QueryRememberMe) { 
    // Check if user logged in 
    var logged = QueryRememberMe.query(); 
    logged.then(function (greeting) { 
     alert("Success: " + greeting); 
    }, function(reason) { 
     alert("Failed: " + reason); 
    }); 
    }; 
}); 

QueryRememberMe服務

var queryRememberMe = angular.module("queryRememberMe", []); 
queryRememberMe.service("QueryRememberMe", function ($q, Database) { 

    var db = Database.init(); 
    var tableName = "tb_UD_remember_me"; 
    var userLoggedIn = ""; 

    var myFunctions = { 
     query: function() { 
      return $q(function (resolve, reject) { 
       var sql = 'SELECT * FROM ' + tableName; 
       db.transaction(function (tx) { tx.executeSql(sql, [], myFunctions.success, myFunctions.error); }); 

       if (myFunctions.success) { 
        resolve('Hello, success!'); 
       } 
       else { 
        reject('Greeting ERROR - is not allowed.'); 
       } 
      }); 
     }, 

     // Query success callback 
     success: function (tx, results, tableName) { 
      // There are no values in the table 
      if (results.rows.length == 0) { 
       userLoggedIn = false; 
      } 
      else { 
       userLoggedIn = true; 
      } 
      return userLoggedIn; 
     }, 

     // Query Error Callback 
     error: function (tx, err) { 
      alert("An error has occured - Unable to query SQL Table " + tableName); 
     }, 
    } 
    return myFunctions; 
}); 

回答

1

嘗試更新如下圖所示(它是沒有測試)。

在服務

var myFunctions = { 
    query: function() { 
     var deferred = $q.defer(); 
     var sql = 'SELECT * FROM ' + tableName; 
     var success = function(tx, results, tableName) { 
      if (results.rows.length == 0) { 
       deferred.resolve({userLoggedIn: false}); 
      } 
      else { 
       deferred.resolve({userLoggedIn: true, message: 'Hello, success!'}); 
      } 
     } 
     var error = function(tx, err) { 
      deferred.reject({userLoggedIn: false, message: 'An error has occured - Unable to query SQL Table'}); 
     } 

     db.transaction(function (tx) { 
      tx.executeSql(sql, [], success, error); 
     }); 
     return deferred.promise; 
    } 
}; 

在你的控制器

var logged = QueryRememberMe.query(); 
logged.then(
    function (greeting) { 
     alert("Success: " + greeting.message); 
    }, 
    function(reason) { 
     alert(reason.message); 
    } 
);