Node.js 组合几个异步/等待调用的结果(再次)

Node.js 组合几个异步/等待调用的结果(再次),node.js,asynchronous,async-await,Node.js,Asynchronous,Async Await,请注意,潜在的收信人或标记人重复:中未回答此问题,因为其中的所有回答都单独处理通话,并且没有解释如何处理连续的、相关的通话 这个问题与中的基本相同,但由于我的背景稍有不同,我看不出其中的解决方案可以如何调整/模仿 我使用一个只知道回调的旧API连续两次调用数据库。第二个调用需要第一个调用返回的对象/值 我有一个工作回调版本的代码,如下所示: connection.query(sql1,function(error1,results1,fields1) { if(error1) {

请注意,潜在的收信人或标记人重复:中未回答此问题,因为其中的所有回答都单独处理通话,并且没有解释如何处理连续的、相关的通话

这个问题与中的基本相同,但由于我的背景稍有不同,我看不出其中的解决方案可以如何调整/模仿

我使用一个只知道回调的旧API连续两次调用数据库。第二个调用需要第一个调用返回的对象/值

我有一个工作回调版本的代码,如下所示:

connection.query(sql1,function(error1,results1,fields1) {
    if(error1) {
         console.log("Error during first query",error1);
    }
    let sql2=computeUsingFirstResult(result1);

    connection.query(sql2,function(error2,results2,fields2) {
      if(error2) {
           console.log("Error during second query",error2);
       }
       doSomething(connection,results1,results2);
      })  
});
以下是我尝试以异步/等待方式执行此操作的失败尝试:

const util = require('util');
async function firstQuery(connection) {
    return util.promisify(connection.query).call(sql1).catch(
        error1 => console.log("Error during first query : ", error1)
    );;
}

async function secondQuery(connection, result1) {
    let sql2 = computeUsingFirstResult(result1);
    return util.promisify(connection.query).call(sql2).catch(
        error2 => console.log("Error during second query : ", error2)
    );
}

let finalResult = {};

async function main() {
    const results1 = await firstQuery(connection);
    const results2 = await secondQuery(connection, results1);
    doSomething(connection, results1, results2);
    finalResult = [results1,results2];
    console.log("Here is the finalResult : ", finalResult);
}

main().catch(
    err => console.log("Something went wrong towards the end", err)
);



我的异步/等待版本失败,因为所有中间结果都
未定义
。然而,据我所知,它应该与上面的非异步版本等效


正确的方法是什么?

我希望您可以尝试以下两种方法,看看它们是否有帮助:

(1) 将
firstQuery
secondQuery
util.promisify
绑定到
connection
,如下所示:

异步函数firstQuery(连接){ 返回util.promisify(connection.query).bind(connection,sql1)().catch( error1=>console.log(“第一次查询时出错:”,error1) );; } //bind确保连接对象的内部绑定处于tact状态 如果上述方法没有产生任何结果,请尝试下一种方法:

(2) 尝试对第一个查询和第二个查询使用
promisify
而不是
util.promisify
,如下所示:

函数firstQuery(连接,sql1){
返回新承诺((解决、拒绝)=>{
查询(sql1,函数(error1,results1,fields1){
返回错误1?拒绝(错误1):解决(结果1);
})
});
}
现在使用
main
函数中的Async/Await在代码中调用它们

我在代码中注意到的几个潜在错误/打字错误: (1) firstQuery似乎没有作为其参数之一传递
sql1
,如果全局范围中存在
sql1
,这可能是故意的

(2) 如果将catch块附加到两个查询,它们将对您的两个调用产生影响(请参见下面代码中的注释):

异步函数main(){
const results1=await firstQuery(连接);//出现了什么错误?@FahadSubzwari一切都没有定义。我忘了在我的问题中提到,它现在被添加进去了,您是否尝试
控制台
结果1
结果2
?如果是,那么结果是什么output@EwanDelanoy请将您的
util.promisify
代码包含在question@Liam见r
util.promisify
上的文档(顺便说一句,它的名字就是这么说的)谢谢您的详细帮助,我会调查一下的