Как отправить данные обратно в функцию успеха ajax? - PullRequest
0 голосов
/ 26 сентября 2018

Я делаю SQL-запрос с функцией do_sql_query, которая возвращает строку после завершения.Как я могу отправить строку обратно в мой запрос AJAX.Я запутался в том, как использовать промежуточное ПО и правильные обратные вызовы, чтобы он работал.

Я использую эту библиотеку, чтобы помочь мне выполнить запросы mysql: mysql

app.post('/check', (req,res)=>{

    res.send(do_sql_query())

})

do_sql_query = ()=>{

    var string_to_be_returned;

    mysql_query_function('SELECT * FROM...', (results)=>{

        string_to_be_returned = results.string_Response
    })
    return string_to_be_returned
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Как сказал @Chris, проблема в том, что вы не ожидаете выполнения запроса.Я сам не фанат Обещаний (если вы не можете использовать await/async), поэтому я покажу вам, как это сделать с обычными обратными вызовами.

app.post('/check',(req,res)=>{
  do_sql_query((err, results) => {
     if(err) return res.status(500).send("Something went wrong");
     return res.send(results);
  });
});

do_sql_query = (callback) = > {
  mysql_query_function('SELECT * FROM...`, (err, results) =>{
    // you don't show how you're defining your mysql_query_function, but most node is error-first callback
    if (err) return callback(err); 
    return callback(null, results);
  }
}

Обратите внимание, что каждый раз, когда вы делаете асинхронный вызов, вы не можете «вернуть» результаты этого вызова, так как эти результаты не будут доступны позже.Вы должны использовать некоторую форму функции обратного вызова (независимо от того, заключаете ли вы ее в синтаксический сахар Promise), чтобы обработать результаты вашего асинхронного вызова.

0 голосов
/ 26 сентября 2018

Основная проблема с вашим фрагментом кода заключается в том, что вы возвращаетесь слишком рано, не ожидая выполнения запроса.

Любую асинхронную функцию (в основном то, что имеет аргумент обратного вызова или подобное), которую вам нужно будет обернутьв обещании или шаблоне, который вы выбираете, чтобы маршрут мог отложить отправку ответа до завершения запроса.

Это только пример кода:

// promise approach
app.post('/check', (req, res) => {
  do_sql_query()
    .then(value => {
      res.send(value)
    })
    .catch(err => {
      // log or something
    })
})

// await approach
app.post('/check', async (req, res) => {
  const value = await do_sql_query()
  res.send(value)
})

do_sql_query = () => {
  return new Promise((resolve, reject) => {
    // Not sure of this function, but lets assume it queries the db in an async manner
    //                    missing quote --v
    mysql_query_function('SELECT * FROM...', results => {
      const string_to_be_returned = results.string_Response
      resolve(string_to_be_returned)
    }) // <-- missing in your original snippet
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...