2012-03-29 17 views
1

Ich habe ein kleines bisschen Ärger ... Ich versuche, ein Suchergebnis als Teil einer Web-App zu bekommen, aber auf ein kleines Problem getroffen.Zurückgegebene Variable ist 'undefined' durch JavaScript-Funktion

Ich habe eine Funktion, die auf eine Schaltfläche klicken läuft:

$(function() { 
    $('#bnt_fund_8y').click(function() { 
     console.log(dbCheck("study_mode")); 
} 
}); 

Diese DBCheck Funktion weggeht und überprüfen Sie die lokale DB zu sehen, welche study_mode eingestellt ist, in der folgenden Funktion:

dbCheck = function(dbSearch) { 
    mydb.transaction(
     function(transaction) { 
      transaction.executeSql('SELECT "'+dbSearch+'" FROM funding WHERE id = 1',[], function(transaction, results) { 
       var dbResult = results.rows.item(0).study_mode; 
       alert(dbResult); 
       return(dbResult); 
      }, errorHandler); 
     }); 
    } 

Die Warnung zeigt die richtige Variable an, aber das Konsolenprotokoll zeigt undefined an. jede Hilfe zu diesem willkommen ...

+0

Das ist eine ... interessante Verspannung Stil haben Sie da. –

Antwort

2

transaction ist ein asynchroner Anruf, so dass Ihre Funktion zurückkehrt (ohne jeden Wert zurückkehrt) vor dem Rückruf Sie geben transaction auftreten. Die return-Anweisung in Ihrem Code gibt nichts aus dbCheck zurück, sondern eher aus der von Ihnen bereitgestellten Rückruffunktion.

Sie müssen die Funktion ändern und wie Sie sie aufrufen.

Funktionsänderungen:

// add callback parameter --v 
dbCheck = function(dbSearch, callback) { 
    mydb.transaction(
     function(transaction) { 
      transaction.executeSql('SELECT "'+dbSearch+'" FROM funding WHERE id = 1',[], function(transaction, results) { 
       var dbResult = results.rows.item(0).study_mode; 
       alert(dbResult); 
       // Call the callback with the result 
       callback(dbResult); 
      }, errorHandler); 
     }); 
    } 

es aufrufen:

$(function() { 
    $('#bnt_fund_8y').click(function() { 
     dbCheck("study_mode", function(result) { 
      console.log(result); 
     }); 
} 
}); 
0
dbCheck = function(dbSearch) { 
    mydb.transaction(
    ... 
    ); 
} 

gibt nichts zurück, so dass der Wert, den Sie ist undefined erhalten. Da transaction ein asynchroner Aufruf mit Rückruffunktionen zu sein scheint, wäre die einzige nützliche Sache, die zurückgegeben wird, ein Versprechen für dbResult.

0

Sie können vom Rückruf eines asynchronen Anrufs nichts zurückgeben. Verwenden Sie einen Rückruf für das Ergebnis auch:

dbCheck = function(dbSearch, callback) { 
    mydb.transaction(
    function(transaction) { 
     transaction.executeSql('SELECT "'+dbSearch+'" FROM funding WHERE id = 1',[], function(transaction, results) { 
     var dbResult = results.rows.item(0).study_mode; 
     callback(dbResult); 
     }, errorHandler); 
    }); 
    }); 
}; 

Verbrauch:

dbCheck("study_mode", function(value) { 
    console.log(value); 
}); 
0

Von dem, was ich sagen kann,

die Funktion DBCheck ist gar nichts zurück.

mydb.transactionist die Funktion, die tatsächlich etwas zurückgibt.

Wie alle anderen darauf hinweisen, ist mydb.transaction asynchron.

sollten Sie fügen nur

console.log(dbResult); 

in den Rückruf in mydb.transaction geleitet wird

Verwandte Themen