2017-06-29 3 views
1

Ich bin kein Profi mit Node.JS und Javascript als Ganzes, also bitte verzeiht mir, wenn dies eine dumme Frage.Node.JS - Warten Sie eine Funktion vor der Ausführung Rest des Codes beenden

ich einen Node.JS Server leite Socket-Verbindungen für eine Website zu akzeptieren, dass ich laufen werde, und ein Teil von dem, was dieses Skript gemeint ist, zu tun, ist eine Datenbank, in Verbindung. Ich habe eine Funktion, die dies vor dem Starten des Servers tun soll. Wenn ich jedoch die Funktion aufruft, fährt sie mit dem Rest des Codes fort und wartet nicht auf die Beendigung der Funktion. Ich habe versucht, Callbacks zu verwenden, aber ohne Erfolg, und ich habe keine Ahnung, wie man Promises einsetzt. Kann jemand erklären, wie ich dieses Problem löse?

Hier ist mein Code als Referenz:

function GetCompetitionInfo(competitionID,callback){ 
    var competitionInfo = { 
     id:competitionID, 
     title:"", 
     topic:"", 
     difficulty:"", 
     description:"", 
     jackpot:0, 
     answer:0, 
     author:0 
    } 
    var testVariable; 
    sqlConnection_read.connect(function(err){ 
     if(err) throw err; 
     console.log("Connected to TSDB, retrieving competition info..."); 
     var query = "SELECT * FROM competitions WHERE PuzzleID="+competitionID+";"; 
     sqlConnection_read.query(query,function(err,result){ 
      if(err) {console.log("Uh oh spaghettiohs");throw err;} 
      competitionInfo.title = result[0].Puzzle_Title; 
      competitionInfo.topic = result[0].Puzzle_Topic; 
      competitionInfo.difficulty = result[0].Puzzle_Difficulty; 
      competitionInfo.description=result[0].puzzle_description; 
      competitionInfo.answer=result[0].Puzzle_Answer; 
      competitionInfo.jackpot=result[0].Puzzle_Jackpot; 
      competitionInfo.author=result[0].Puzzle_Author; 
      callback(competitionInfo); 
     }); 
    }); 
} 
GetCompetitionInfo(0,function(data){ 
    competitionInfo=data;//This is a variable outside of the scope 
}); 
//I want this to be executed afterwards 
var competitionTitle = competitionInfo.title; 
var competitionTopic = competitionInfo.topic; 
var competitionDifficulty = competitionInfo.difficulty; 
var competitionDescription = competitionInfo.description; 
var competitionAnswer = competitionInfo.answer; 
var jackPotTotal = competitionInfo.jackpot; 
var competitionAuthor = competitionInfo.author; 

console.log("Title:"+competitionTitle); 
console.log("Topic:"+competitionTopic); 
console.log("Difficulty:"+competitionDifficulty); 
console.log("Description:"+competitionDescription); 
console.log("Answer:"+competitionAnswer); 
console.log("Jackpot:"+jackPotTotal); 
console.log("Author UID:"+competitionAuthor); 

Aber dies scheint sofort ausgeführt werden, bevor die GetCompetitionDetails Funktion beendet hat. Wie kann ich sie nacheinander ausführen lassen?

+1

einfach es in dem Rückruf setzen oder eine Rück Versprechen ... –

Antwort

1

NodeJS und JavaScript verwendet callbacks, um den Fluss Ihrer Anwendung zu steuern. Promises den Code vereinfachen, so dass Sie in etwas am Ende nicht callback hell genannt.

einfachste es zu beheben Ihre Aufgaben in den Rückruf zu bewegen:

// function(data) { ... } is the callback that will be executed AFTER GetCompetitionInfo is finished. Anything you want to do after will have to be in that function. 
GetCompetitionInfo(0, function(data){ 

    // everything in this block will be run AFTER GetCompetitionInfo is finished 
    competitionInfo=data; 

    var competitionTitle = competitionInfo.title; 
    var competitionTopic = competitionInfo.topic; 
    var competitionDifficulty = competitionInfo.difficulty; 
    var competitionDescription = competitionInfo.description; 
    var competitionAnswer = competitionInfo.answer; 
    var jackPotTotal = competitionInfo.jackpot; 
    var competitionAuthor = competitionInfo.author; 

    console.log("Title:"+competitionTitle); 
    console.log("Topic:"+competitionTopic); 
    console.log("Difficulty:"+competitionDifficulty); 
    console.log("Description:"+competitionDescription); 
    console.log("Answer:"+competitionAnswer); 
    console.log("Jackpot:"+jackPotTotal); 
    console.log("Author UID:"+competitionAuthor); 

}); 

Für weitere Informationen über all dies überprüfen Sie die Antwort in der doppelten Frage: How do I return the response from an asynchronous call?

+1

Mann, ich fühle mich jetzt ziemlich dumm. x.x Es war wirklich so einfach. Ich wollte diese Lösung versuchen, dachte aber, dass das nicht funktioniert hätte, also tat ich es nicht. Naja. Trotzdem danke. <3 –

+0

Keine Sorge, es ist ein Fehler, den Sie nur einmal machen. Ich würde empfehlen, die doppelte Frage zu bookmarken, die gepostet wurde, es ist sehr gut geschrieben und es erklärt, wie synchrone/asynchrone Verhalten in JavaScript funktioniert. Mach dir keine Sorgen, wenn du es noch nicht verstehst, behalte es einfach als Referenz, wenn du es brauchst. – shotor

Verwandte Themen