2017-08-17 2 views
1

Ich bekomme Daten von einer MySQL-Abfrage und schiebe dann die Elemente in ein Array. Sobald ich jedoch die Abfrage verlassen habe, ist das Array leer. Ich schätze, das liegt daran, dass die Elemente im Array nur Referenzen sind. Aber wie behalte ich die Elemente im Array?Nachdem Elemente im Array verschoben wurden, ist es leer.

var timeblocked = []; 
 
var timeunblocked = []; 
 
connection.query("SELECT user_relationships.*, block_intervals.* FROM user_relationships INNER JOIN block_intervals ON user_relationships.id = block_intervals.relationfk WHERE (user1 = '"+currentUserID+"' AND user2 = '"+user2_in_blockedRelationship+"' AND timeunblocked IS NOT NULL)", function(error, resultsForBlock){ 
 
    for (var i = 0; i<resultsForBlock.length; i++) { 
 
    timeblocked.push(resultsForBlock[i].timeblocked); 
 
\t timeunblocked.push(resultsForBlock[i].timeunblocked); 
 
    } 
 
console.log("1. timeblocked: ", timeblocked, "timeunblocked: ", timeunblocked); // shows all of the elements in the array 
 
}); 
 
console.log("2. timeblocked: ", timeblocked, "timeunblocked: ", timeunblocked); //This shows an empty array

Warum ist die zweite console.log()NICHT das Array anmelden?

+0

Sie verwenden async Funktion, um Ihr Wunschergebnis zu erhalten, verwenden Rückruf oder Versprechen – sabbir

+0

Weil 'connection.query' async Funktion ist –

+0

Okay. Ich bin ziemlich neu in diesem Bereich. Wie würden Sie die Abfrage anders machen? – suonpera

Antwort

1

Dies ist asynchrones Verhalten. Sie sollten warten, bis die Ausführung der Callback-Ausführung abgeschlossen ist.

Ihr zweites Konsolenprotokoll wird ausgeführt, bevor der Aufruf von db abgeschlossen wird.

Am besten verwenden Sie das Array erst, nachdem Sie mit dem SQL-Aufruf fertig sind.

connection.query("SELECT user_relationships.*, block_intervals.* FROM user_relationships INNER JOIN block_intervals ON user_relationships.id = block_intervals.relationfk WHERE (user1 = '"+currentUserID+"' AND user2 = '"+user2_in_blockedRelationship+"' AND timeunblocked IS NOT NULL)", function(error, resultsForBlock){ 
    for (var i = 0; i<resultsForBlock.length; i++) { 
    timeblocked.push(resultsForBlock[i].timeblocked); 
     timeunblocked.push(resultsForBlock[i].timeunblocked); 
    } 
console.log("1. timeblocked: ", timeblocked, "timeunblocked: ", timeunblocked); // shows all of the elements in the array 



// TODO -- remaining all code that uses the array. 

}); 

Besser Sie verwenden promises, wenn Sie nicht bewusst sind.

+0

Ich dachte daran, dies zu tun, aber aufgrund der Komplikation des Rests meines Codes, wäre es viel einfacher, wenn ich dies zur Arbeit bringen könnte, und nicht den Code in der Abfrage hinzufügen. – suonpera

+0

@jonasPW Versprechen sind deine Freunde :) –

+0

@SURESH Wie würdest du meine Anfrage mit Versprechen machen? – suonpera

Verwandte Themen