2016-09-07 3 views
0
zurückgegeben

Was ich versuche, ist eine Art von Storage-Service zu erstellen, in dem ich eine SQLite-Datenbank verwenden, um Schlüssel und Wertpaare zu speichern, die ich basierend auf dem Schlüssel abrufen kann. Um dies zu erreichen, richte ich den folgenden Code ein:SQLite-Abfrageergebnis nicht von Funktion

.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]); 
    } 
    }; 
}) 

Jetzt funktioniert das meiste dieses Zeug großartig. Ich kann Elemente in der db speichern und sogar abrufen und melden sie aus dem Inneren der Funktion, wie Sie auf die folgende Zeile sehen:

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

Als ich das log ich den Erwartungswert zu bekommen, aber wenn ich es und log zurückkehren In der Steuerung, in der ich diesen Dienst verwende, bleibt er undefiniert. Der Code in meinem Controller sieht wie folgt aus:

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

Bitte beachten Sie, dass es keine Konsole Fehler sind. Nur zwei Protokolle. Ein von der Steuerung, die nicht definiert ist, und eine aus dem Dienst, der den Wert wie gewünscht zurückgibt:

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

Ich war jemand der Hoffnung kann sagen, was hier schief geht. Wenn es irgendwelche Informationen oder Codes gibt, die hilfreich sein können und ich weggelassen habe, lass es mich wissen.

Antwort

0

Das liegt daran, dass Ihreein Versprechen verwendet, um die Ergebnisse abzurufen.

versuchen, Ihren Code auf diese Stelle ändern:

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

und Ihren Dienst auf diese Weise nennen:

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

Sie werden dann die Ergebnisse anzuzeigen können.

Ich empfehle Ihnen, einige basic principles Versprechen zu studieren: Sie werden sie sehr oft begegnen, wenn Sie $ http Get und Post Anfragen und andere asynchrone Sachen in Javascript verwenden.

Verwandte Themen