#javascript #mysql #promise
#javascript #mysql #обещание
Вопрос:
Я пытаюсь настроить чат-бота js messenger, связанного с базой данных. Конечно, иногда пользователь запрашивает данные из базы данных у чат-бота, и я использую promise для их сбора. Я недавно узнал о них, поэтому знаю только основы. Моя проблема в том, что когда обещание выполнено, мне нужно не только запустить некоторый код (который выполняется с помощью функции then()), но и вернуть данные в основной модуль, чтобы создать ответ. Как я могу возобновить свою функцию (для достижения возврата) после выполнения обещания? Вероятно, мне трудно понять, поэтому это диаграмма последовательности моего чат-бота и некоторые фрагменты моего кода.
Основной процесс запроса базы данных
app.js
const Database = require("./services/database");
const Message = require("./services/message");
app.get("/endpoint", (req,res)=>{
let message
//Check if the user message request data
if (req == datarequest)
{
message = Database.request();
}
else
{
message = "You did not require any data";
}
Message.sendToUser(message);
});
DBInteractionModule.js
async request()
{
//Creating the promise
let promise = new Promise(
function(){
let connection = db.connect();
return connection.query("SELECT * FROM user;");
}
);
// Only(?) way to use data when it returns
promise.then(function(data)
{
console.log("data requested : " data);
});
//I need to use this return in order to give data back to the main app
return promise;
}
Спасибо 🙂
Комментарии:
1. асинхронная функция всегда возвращает обещание (!). Итак, вы возвращаете обещание<Обещание<…>>. Если вы просто вернетесь
data
(при успешном выполнении), возвращаемое значение будет Promise с данными. Затем вы можете получить доступ к своим «данным» в app.js используяthen()
Ответ №1:
Обещания сложны при первом их использовании, но как только вы привыкнете к ним, все сводится к ожиданию, а затем разрешению или отклонению обещания.
Я предполагаю, что db.connect
и connection.query
оба возвращают обещание, поэтому вам нужно подождать, пока они выполнят там обещания.
// the `async` word before the functions here is important
const request = new Promise(async (resolve, reject) => {
// wait for the db to connect
let connection = await db.connect();
// wait for the db to return it's data
const data = await connection.query("SELECT * FROM user;");
// after waiting, if no error, the data should be available now
console.log('Requested data (WITHIN the promise) : ', data);
//return the data by resolving the main promise
resolve(data)
});
Использование :
request.then(data => {
console.log('Requested data (OUTSIDE the promise) : ', data);
//Process data
});
Или внутри другой асинхронной функции :
async function main() {
const data = await request;
console.log('Requested data (OUTSIDE the promise) : ', data);
}
Комментарии:
1. Спасибо за ваш ответ, я думаю, что понял это. Однако проблема, с которой я сталкиваюсь здесь, заключается в том, что я не могу использовать асинхронную функцию (поскольку я использую существующий код, написанный только для синхронизации), и мне нужно получить доступ к функции возврата, где находится мое обещание. Вот так: « myFunction(){ const request = New Promise(…); //Создание моего обещания, которое получит запрос данных БД.затем({ // Я мог бы обработать данные здесь, но я хочу, чтобы они были возвращены родительской функции }); вернуть данные; } «
2. Я, наконец, исправил свою проблему, установив асинхронность перед каждой функцией, которую я использую, чтобы «ожидать» каждый раз, когда я ее вызываю. Но я все еще хочу знать, был ли другой обходной путь, поскольку (я думаю), трюк с асинхронностью каждой функции, вероятно, не сработает в любое время. Я должен был быть таким кошмаром в прошлом, когда promise не существовало, и им приходилось использовать обратные вызовы…
3. Рад, что это помогло вам, и да, раньше это был кошмар… теперь просто помните, что ставьте
async
перед любой функцией, в которой есть обещание, иawait
чтобы дождаться выполнения этих обещаний, всегда проверяйте документы, чтобы узнать, возвращает ли какой-либо метод обещание, это может быть что угодно из вызова db для загрузки изображений или видео, API, удаленных данных…