Как мне написать этот кусок js-кода узла асинхронно

Я пытаюсь обработать почтовый запрос. Я хочу, чтобы это получило сообщение с требованием, запустило запрос и захватило некоторые данные, а затем изменило несколько переменных. Затем визуализируйте файл index.ejs вместе с измененными переменными.

Работает нормально. Но проблема здесь в том, что сначала выполняется рендеринг страницы, а затем обновление переменных. Как мне действовать в обратном порядке? Думаю, может, мне стоит изменить свой код асинхронно. Я не знаю, как это сделать.

 app.post('/id',function (req, res) {

    // Run a mysql query

 con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', 
 function(error,results, fields) {
        if (error)
            throw error;

       //update some variables here

    });

// render the index.ejs file and an updated varible (ejs and express stuff) 

 res.render("index",{
changed_variable:changed_variable
   });

});

Вы пытались поместить res.render в обратный вызов успешного запроса?

sadrzadehsina 18.12.2018 11:36

Я также предлагаю вам взглянуть на npmjs.com/package/async

sadrzadehsina 18.12.2018 11:37

Большое спасибо, чувак. Я пробовал много чего, но был слишком туп, чтобы не попробовать это. Помещение res.render в обратный вызов успешного запроса сработало!

JayaSuriya RS 18.12.2018 11:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
38
2

Ответы 2

Вы можете просто поместить свой res.render в обратный вызов успешного выполнения запроса, как показано ниже:

con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', function(error,results, fields) {
  if (error)
    throw error;

    //update some variables here
    res.render("index",{ changed_variable:changed_variable });
})

Однако предлагаемый подход заключался бы в использовании модуля async, установите его следующим образом:

npm install --save async

С модулем async можно написать что-то вроде этого.

router.get('/id', function(req, res) {
  async.series([
    con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', function(error,results, fields) {
        if (error)
            throw error;

       //update some variables here

    })
  ],
  function(err, results) {
    res.render("index",{ changed_variable:changed_variable });
  })
})

Код уже асинхронный. Если вы хотите отобразить страницу после завершения обработки запроса, вы должны поместить визуализацию внутри обратного вызова.

con.query('SELECT * FROM new_table ORDER BY RAND() LIMIT 9', 
function(error,results, fields) {
    if (error)
        throw error;

    //update some variables here
    res.render("index",{
      changed_variable:changed_variable
    });

})

Другие вопросы по теме