2012-03-30 7 views
0

Ich bin mir ziemlich sicher, dass dies eine Frage von zehn Penny Schließung ist. Aber nachdem ich ein paar Artikel über Schließungen gelesen habe, kann ich das immer noch nicht zur Arbeit bringen.Unerwartete Verhaltensweisen mit Abschlussfunktionsbereich

character wird immer als 'Z' zurückgegeben. character ist auch eine globale Variable.

I "machen" zu erinnern, den Charakter in der Schleife müssen:

populateList: function() 
{   
    var render = function(tx, result) 
    { 
     console.log(character); 

     for (var i = 0; i < result.rows.length; i++) 
     { 
      var contact = result.rows.item(i); 
      console.log(contact.Name); 
     } 
    } 

    var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    for(var i = 0; i < str.length; i++) 
    { 
     var nextChar = str.charAt(i); 
     database.open(); 
     var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name"; 
     database.query(sql, render); 
    } 
} 
+1

Also was genau ist das Problem? –

+9

Auf Anhieb - rohe SQL-Strings in Javascript BEGGING für Ärger. – asawyer

+1

und 'Zeichen' ist wo genau definiert? sieht wie eine globale Variable aus, die das Problem sein kann. –

Antwort

1
var render = function(character) 
{ 
    return function(tx, result) 
    { 
     console.log(character); 

     for (var i = 0; i < result.rows.length; i++) 
     { 
      var contact = result.rows.item(i); 
      console.log(contact.Name); 
     } 
    } 
} 

Verbrauch:

database.query(sql, render(nextChar)); 

Edit:

Auch ist asawyer oben in seinem Kommentar richtig - vorausgesetzt, Sie node-mysql verwenden, es Unterstützung für parametrisierte Abfragen hat:

database.query("SELECT * FROM foo WHERE bar = ?", [ 1 ]); 

, dass die Nutzung und selbst einige Mühe sparen!

0

Ungeprüfte:

populateList: function() 
{   
    var render = function(char) 
    { 
     console.log(char); 
     return function(tx, result) { 

      for (var i = 0; i < result.rows.length; i++) 
      { 
       var contact = result.rows.item(i); 
       console.log(contact.Name); 
      } 
     }; 
    } 

    var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    for(var i = 0; i < str.length; i++) 
    { 
     var nextChar = str.charAt(i); 
     database.open(); 
     var sql = "SELECT Name FROM Contact WHERE Name LIKE \'" + nextChar + "%\' ORDER BY Name"; 
     database.query(sql, render(nextChar)); 
    } 
} 
0

eine sofort ausgeführte Funktion verwenden, die eine Funktion gibt, die render mit den Parametern aufrufen:

database.query(sql, (function(nextChar) { 
    return function(tx, result) { 
     return render(tx, result, nextChar); 
    }; 
})(nextChar)); 

dann den entsprechenden Parameter auf nextCharrender auch hinzuzufügen.

0
var render = function(tx, result) 
{ 
    console.log(character); 
    ***var char = character;*** 
    for (var i = 0; i < result.rows.length; i++) 
    { 
     var contact = result.rows.item(i); 
     ***console.log(char);*** 
     console.log(contact.Name); 
    } 
} 

Ich denke, das ist, was Sie brauchen. füge die markierten Zeilen hinzu. Prost

Verwandte Themen