2016-09-07 94 views
0

我想要做的是創建一種存儲服務,其中我使用SQLite數據庫來存儲鍵和值對之後,我可以檢索它們基於密鑰。爲了達到這個目的,我建立了以下代碼:SQLite查詢結果不是從函數返回

.service('StorageService', function($cordovaSQLite, $q) { 

    if(window.cordova) { 
    db = $cordovaSQLite.openDB("vouchers.db"); 
    } else { 
    db = window.openDatabase("vouchers.db", "1.0", "Vouchers db", -1); 
    } 
    $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS vouchers (key text, value text)"); 

    return { 
    getItem: function(item) { 
     var query = "SELECT key, value FROM vouchers WHERE key = ?"; 
     $cordovaSQLite.execute(db,query,[item]).then(function(result) { 
     console.log(result.rows[0].value); 
     return result.rows[0].value; 
     }); 
    }, 
    setItem: function(item, data) { 
     var query = "INSERT INTO vouchers (key, value) VALUES (?,?)"; 
     return $cordovaSQLite.execute(db, query, [item, data]); 
    } 
    }; 
}) 

現在,這些東西大部分都很好用。我可以存放物品的分貝甚至檢索和在函數內部記錄它們,你可以在下面一行看到:

console.log(result.rows[0].value); 

當我登錄這個我得到的預期值,但是當我回到它和日誌它在我使用此服務的控制器中尚未定義。我的控制器中的代碼如下所示:

var test = StorageService.getItem("testje"); 
console.log(test); 

請注意,沒有控制檯錯誤。只有兩個日誌。一位來自控制器是不確定的,和一個從返回值如預期的服務:

controllers.js:465 undefined 
services.js:122 dit is een testje! 

我希望誰能告訴到底是怎麼回事錯在這裏。如果有任何信息或代碼可以幫助我離開,請告訴我。

回答

0

這是因爲您的getItem: function(item) {使用承諾來檢索結果。

試圖改變你的代碼到這個代替:

getItem: function(item) { 
    var query = "SELECT key, value FROM vouchers WHERE key = ?"; 
    return $cordovaSQLite.execute(db,query,[item]); 
}); 

,並打電話給你的服務是這樣的:

StorageService.getItem("testje").then(function(result){ 
    console.log(result); 
}); 

您可以查看結果的話。

我建議你學習一些承諾的basic principles:如果你在javascript中使用$ http獲取和發佈請求以及任何其他異步的東西,你會經常遇到它們。