Node.JS - дождаться завершения функции перед выполнением оставшегося кода [дубликата]

1

Я не профессионал с Node.JS и Javascript в целом, поэтому, пожалуйста, простите меня, если это глупый вопрос.

Я запускаю сервер Node.JS, чтобы принимать соединения сокетов для веб-сайта, на котором я буду запущен, а часть того, что должен сделать этот сценарий, - это связаться с базой данных. У меня есть функция, которая предназначена для этого, прежде чем запускать сервер. Однако, когда я вызываю функцию, она все равно остается с остальной частью кода и не ждет завершения функции. Я пробовал использовать обратные вызовы, но безрезультатно, и я не знаю, как использовать Promises. Может кто-нибудь объяснить, как я разрешаю эту проблему?

Вот мой код для справки:

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
    Просто поместите это в обратный вызов или верните обещание ...
Теги:
asynchronous

1 ответ

1
Лучший ответ

NodeJS и JavaScript используют callbacks для управления потоком вашего приложения. Promises упрощают код, поэтому вы не попадаете в нечто вроде callback hell.

Легко исправить это, чтобы переместить назначения в обратный вызов:

// 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
    Чувак, я чувствую себя довольно глупо сейчас. хх Это действительно было так просто. Я собирался попробовать это решение, но подумал, что это не сработало, поэтому я не сработал. Ну что ж. В любом случае, спасибо. <3
  • 0
    Не беспокойтесь, это ошибка, которую вы делаете только один раз. Я бы порекомендовал добавить в закладки дублированный вопрос, который был опубликован, он очень хорошо написан и объясняет, как синхронное / асинхронное поведение работает в JavaScript. Не беспокойтесь, если вы еще не все поняли, просто держите его для справки, когда вам это нужно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню