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