2010-07-30 16 views
5

diesen Code Betrachten (verkürzt)Werte von verschachtelten Funktionen in Javascript Rückkehr

function getSecret() { 
    db.transaction(
     function (transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        return secret; 
       }, errorHandler 
      ); 
     } 
    ) 
} 

Wie würde ich den Wert von Geheimnis um die Hauptfunktion zurückkehren? Ich habe diese Antwort gelesen Return value from nested function in Javascript

und versuchte, diese

function getSecret() { 
    db.transaction(
     function doSql(transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        return secret; 
       }, errorHandler 
      ); 
     } 
    ) 
    return doSql; 
} 

Doch dies funktionierte nicht.

Danke!

Antwort

4

Versuchen:

function getSecret() { 
    var secret = ''; 

    db.transaction(
     function (transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        secret = row.secret; 
       }, errorHandler 
      ); 
     } 
    ) 

    return secret; 
} 
+12

Ist die Datenbankoperation nicht asynchron? Ich bin mir ziemlich sicher, dass es so ist, und deshalb kann die Lösung hier unmöglich funktionieren. Die Rückruffunktion "Erfolg" wird aufgerufen, wenn die Abfrage abgeschlossen ist, während die äußere Funktion unmittelbar nach dem Start der Abfrage zurückgegeben wird *. – Pointy

+0

Wie funktioniert das, wenn es asynchron ist? – Madhusudhan

+0

wurde dieses "asynchrone" Problem jemals beantwortet? – Black

1
function getSecret() { 
    var retval = undefined; // or a reasonable default 
    db.transaction(
     function doSql(transaction) { 
      transaction.executeSql(
       'SELECT * FROM table LIMIT 1;', 
       null, 
       function(transaction, result) { 
        var row = result.rows.item(0); 
        var secret = row.secret; 
        retval = secret; 
       }, errorHandler 
      ); 
     } 
    ) 
    return retval; 
} 

Dies wird eine Schließung über die retval Variable erstellen. Wenn transaction aufgerufen wird, wird retval aktualisiert.

+6

Dies wird nicht funktionieren. Die Callback-Funktion aus der Abfrage wird asynchron ausgeführt, während die Rückgabe von 'getSecret()' unmittelbar nach dem Start der Transaktion erfolgt *. – Pointy

0

Versuchen Sie, die Datenbankoperation zu promi- sieren, bevor Sie Ihre Payload zurücksenden.

Darüber hinaus können Sie das eingebaute reject() von promise als Error-Handler verwenden und das Transaktionsobjekt immer dann zurückgeben, wenn die Funktion undefined zurückgibt.

Declare Versprechen in Funktion:

function getSecret() { 
    var secret = ''; 
    return new Promise(function(resolve, reject) { 
     db.transaction(
      function(transaction) { 
       transaction.executeSql(
        'SELECT * FROM table LIMIT 1;', 
        null, 
        function(transaction, result) { 
         if (typeof(result) === 'undefined') { 
          var row = result.rows.item(0); 
          secret = row.secret; 
          resolve(secret) 
         }, 
         else { 
          reject(transaction) 
         } 
        } 
       ); 
      } 
     ) 
    }) 
} 

dann die Funktion aufrufen.

//If function resolves, log the secret. 
//if function rejects, log the transaction 
getSecret().then(function(secret) { 
    console.log(secret); 
}) 
.catch(function(err) { 
    console.log('Error in db.transaction ' + err) 
}) 

Hoffe, dass hilft.

Verwandte Themen