Как я могу возобновить функцию после выполнения обещания?

#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, удаленных данных…