2017-06-29 7 views
1

Node.JSとJavascriptの専門家ではないので、愚かな質問であれば私を許してください。Node.JS - コードの残りの部分を実行する前に関数が終了するのを待ちます。

Node.JSサーバーを実行して、実行するWebサイトのソケット接続を受け付けます。このスクリプトの目的は、データベースに接続することです。私はサーバーを起動する前にこれを行うように設計された関数を持っています。しかし、私が関数を呼び出すと、それはコードの残りの部分と続けられ、関数が終了するのを待つことはありません。私はコールバックを使用しようとしましたが役に立たず、私はプロミスをどのように使用するのか手がかりがありません。誰かがこの問題をどのように解決するか説明できますか?

は、ここに参照のために私のコードです:

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機能が終了する直前に実行するようです。どのようにしてそれらを順番に実行させるのですか?

+1

は単にコールバックにそれを置くか、返却:重複した質問に答えをチェックし、このすべてについての詳細情報について

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

:最も簡単な

は、コールバックにあなたの割り当てを移動するためにそれを修正します約束する... –

答えて

1

NodeJSおよびJavaScriptは、アプリケーションのフローを制御するためにcallbacksを使用します。 Promisesはコードを簡略化して、callback hellという名前で終わることはありません。 How do I return the response from an asynchronous call?

+1

男、私は今はむしろ馬鹿だと感じます。 x.xそれは本当に簡単でした。私はその解決策を試みるつもりだったが、それはうまくいかないと思ったので、私はそうしなかった。しかたがない。とにかくありがとうございました。 <3 –

+0

心配する必要はありません。間違いは一度だけです。投稿された重複した質問をブックマークすることをお勧めします。これは非常によく書かれており、JavaScriptで同期/非同期の動作がどのように機能するかを説明しています。あなたがまだそのすべてを理解していなければ心配しないでください。必要なときに参考にしておいてください。 – shotor

関連する問題