Node.js 关于NodeJS中的嵌套承诺
有许多线程在这个和使用,我试图找到以下问题的解决方案Node.js 关于NodeJS中的嵌套承诺,node.js,Node.js,有许多线程在这个和使用,我试图找到以下问题的解决方案 getMethod() { execDBQuery(sqlQuery1) .then(productionQueryRows => { prodResultFunc(resultSet) // Calling a function to get another set of DB values .then (result) { console.log(result) // Final result
getMethod() {
execDBQuery(sqlQuery1)
.then(productionQueryRows => {
prodResultFunc(resultSet) // Calling a function to get another set of DB values
.then (result) {
console.log(result) // Final result which will be sent to user
}
});
}
async function prodResultFunc(prodRowSet) {
const results = await Promise.all(
prodRowSet.map( async (objBatchRow) => {
execDBQuery(sqlQuery2)
.then(resultSet => {
read value-1
})
execDBQuery(sqlQuery3)
.then(resultSet => {
read value-2
})
// Create a object using Value-1 & Value-2 and return object to map
});
);
}
我尝试了下面的实现(只执行了一次SQL),效果很好
async function prodResultFunc(prodRowSet) {
const results = await Promise.all(
prodRowSet.map( async (objBatchRow) => {
execDBQuery(sqlQuery2)
.then(resultSet => {
read values using resultSet
Create object with resultSet values
})
return object
});
);
}
但我希望在创建对象时同时使用SQLs(2和3)的值,在这里我很难找到实现的语法。任何指向现有线程的帮助/指针都将非常有用。您可能正在寻找
每当您处理复杂的承诺链时,我发现async/await语法更容易阅读。最终得到的嵌套代码要少得多 下面的示例显示了如何组合两个不同查询的结果:
const prodRowSet=[1,2,3];
//模拟查询功能。
异步函数execDBQuery(sql){
返回[{id:1,query:sql}];
}
异步函数prodResultFunc(prodRowSet){
const results=等待承诺。全部(
prodRowSet.map(异步(objBatchRow)=>{
让resultSet2=wait execDBQuery('sqlQuery2');
让resultSet3=wait execDBQuery('sqlQuery3');
//执行任何您想要合并结果集的操作。
设combinedObj={resultSet2,resultSet3}
返回组合对象;
})
);
返回结果;
}
(异步()=>{
让输出=等待prodResultFunc(prodRowSet);
日志(“输出:”,输出);
})();代码>但是我的execDBQuery在执行SQL之后返回承诺…所以我想在执行SQL2和SQL3之后我将使用.then()…这就是挑战所在。wait关键字将不再需要使用.then()调用。。您可以使代码看起来更像同步代码。。所以它更容易阅读!是的,特里,它正在工作。我得到了预期的结果!。感谢您提供快速、干净的解决方案。太好了!我很高兴能帮上忙!
async function prodResultFunc(prodRowSet) {
const results = await Promise.all(
prodRowSet.map( async (objBatchRow) => {
Promise.all([execDBQuery(sqlQuery2), execDBQuery(sqlQuery3)]).then(function(values) {
//TODO:: Impement you business logic here
console.log(values);
});
});
);
}