Обещание вернуть неопределенный результат в обратный вызов - PullRequest
1 голос
/ 21 февраля 2020

У меня проблемы с получением результата функции обратного вызова. Ниже приведена функция asyn c, которую я вызываю

const utils = {
sendQuery: async function(query){
        // Receives a query and returns raw results
        // Query is using default database specified by pool
        // Returns a Promise 
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            return results;
        } catch(err) {
            throw new Error(err);
        } finally {
            if (conn) return conn.end();
        }
}

module.exports = {
       'utils': utils
}

. Журнал консоли, приведенный выше, возвращает ожидаемый результат.

, а ниже - функция, вызывающая вышеуказанный

*. 1007 *

Журнал консоли выше возвращает неопределенное значение, и я понятия не имею, почему.

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Настоящая проблема здесь заключается в том, что эта часть if (conn) return conn.end();.

Всякий раз, когда вы используете finally, она отменяет все предыдущие return, break, continue или throw, которые происходят либо в указанных блоках try или catch.

Чтобы решить эту проблему, вы должны сделать так:

const utils = {
sendQuery: async function(query){
        // Receives a query and returns raw results
        // Query is using default database specified by pool
        // Returns a Promise 
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            return results;
        } catch(err) {
            throw new Error(err);
        } finally {
            if (conn) conn.end();
        }
}

module.exports = {
       'utils': utils
}

Надеюсь, что это работает

0 голосов
/ 21 февраля 2020

Вам нужно просто вернуть результат, а не вызывать resolv

const utils = {
  sendQuery: async function(query){
        // Receives a query and returns raw results
        // Query is using default database specified by pool
        // Returns a Promise 
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            return results;
        } catch(err) {
            throw new Error(err)
        } finally {
            if (conn) return conn.end();
        }
}

module.exports = {
       'utils': utils
}

0 голосов
/ 21 февраля 2020

Вы можете просто вернуться, или я полагаю, это то, что вы пытались сделать

sendQuery: (query) => {
    let promise = new Promise(async (resolve, reject) => {
        let conn;
        try {
            conn = await pool.getConnection();
            let queryString = query;
            let rows = await conn.query(queryString);
            let results = (this.formatResults(rows));
            console.log(results);
            resolve(results);
        } catch (err) {
            reject(err);
        } finally {
            if (conn) {
                conn.end();
            }
        }
    })
    return promise;
}
0 голосов
/ 21 февраля 2020

По-моему, просто верните results вместо resolve(results). Ваша функция уже asyn c, и объект обещания здесь не создается. И просто бросьте err вместо reject(err);

И так как вы вернетесь в try, вам не нужно ваше заявление finally.

...