Node.JS – 在执行其余代码之前等待函数完成

我不是一个专业的Node.JS和Javascript作为一个整体,所以请原谅我,如果这是一个愚蠢的问题。

我正在运行一个Node.JS服务器来接受我将要运行的网站的套接字连接,而这个脚本的目的之一就是联系一个数据库。 我有一个function是专门在启动服务器之前做到这一点。 但是,当我调用函数时,它继续执行代码的其余部分,不等待函数完成。 我曾尝试使用callback但无济于事,我不知道如何使用Promise。 有人可以解释我如何解决这个问题?

这里是我的代码供参考:

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); 

但是这似乎在GetCompetitionDetails函数完成之前立即执行。 我如何让他们一个接一个地执行?

NodeJSJavaScript使用callbacks来控制应用程序的stream程。 Promises简化代码,所以你不会最终在一个叫callback hell

最简单的修复它将您的任务移到callback中:

 // 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); }); 

有关所有这些的更多信息,请查看重复问题中的答案: 如何从asynchronous调用返回响应?