承诺将未定义的结果返回给回调

时间:2020-02-21 18:23:46

标签: javascript node.js promise mariadb

我在获取回调函数的结果时遇到问题。下面是我正在调用的异步函数

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
}

上面的控制台日志返回预期结果。

及以下是调用以上功能的功能

const db = require('../private/db');

    db.utils.sendQuery(queryString).then(function(result){
        console.log(result);
    }).catch(err=>{
        throw res.render('error', {'error': err.stack});
    })

上面的控制台日志返回未定义,我不知道为什么。

4 个答案:

答案 0 :(得分:1)

真正的问题是这部分import tkinter as tk class App(tk.Tk): def __init__(self): super().__init__() self.title("Math") self.geometry('350x200') self.label1 = tk.Label(self, text=' ') self.label1.grid(column=2, row=0) tk.Button(self, text="Function1", command=self.clicked).grid(column=1, row=0) def clicked(self): self.label1['text'] = self.fct1() def fct1(self): u = 0.1 while 1 + u != 1: u /= 10 return u * 10 App().mainloop()

无论何时使用if (conn) return conn.end();,它都会覆盖在上述{{1}中发生的任何先前的finallyreturnbreakcontinue }}或throw块。

要解决您的问题,您应该这样做:

try

希望它能起作用

答案 1 :(得分:0)

我认为,只需返回results而不是resolve(results)。您的函数已经异步,并且此处未创建任何Promise对象。 然后只抛出err而不是reject(err);

由于您返回了try,因此不需要finally语句。

答案 2 :(得分:0)

您只需要返回结果即可,而不是调用resolve

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
}

答案 3 :(得分:0)

您可以简单地返回,或者我想这就是您想要做的事情

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;
}