如何将预定义函数回调转换为 Promise

Vip*_*ngh 1 node.js async-await node-modules snowflake-cloud-data-platform

您好,我有与雪花连接来执行查询的代码。我想从实现了回调函数的完整密钥中提取数据。有什么方法可以停止该功能,直到它提供完整的信息。比如使用await什么的

var statement = connection.execute({
        sqlText: 'select sysdate() from dual'
        ,complete: function(err, stmt, rows) {
        if (err) {
            context.error('Failed to execute statement due to the following error: ' + err.message);
        } else {
            context.log('Successfully executed statement: ' + stmt.getSqlText());
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

编辑1:

如果我使用

console.log(statement.getStatus()) //output is  {fetching}
Run Code Online (Sandbox Code Playgroud)

但我需要的是一个完整的状态。

Rus*_*9RS 5

您无法将异步函数转换为同步函数。如果您希望您的代码看起来像同步的,那么您可以使用async/await. 包装函数的示例execAsync,用于使用async/await

function execAsync(connection, sqlText) {
    return new Promise((resolve, reject) => {
        connection.execute({
            sqlText: sqlText,
            complete: (err, stmt, rows) => {
                if (err) {
                    return reject(err);
                } 
                return resolve([stmt, rows]);
            }
        });
    });
}

(async () => {
    try {
        const [statement, rows] = await execAsync(connection, 'select sysdate() from dual');
        console.log(statement.getStatus());
    } catch (error) {
        console.error(error);
    }
})();
Run Code Online (Sandbox Code Playgroud)