node.js - Node async/await 中的函数执行顺序
问题描述
我对确保函数按顺序运行以及第一次调用的结果用于第二次调用有疑问。
数据库功能
async runquery(){
try {
...
const results = await db.statementExecPromisified(statement, []);
return results;
} catch (e) {
console.log("Error - " +JSON.stringify(e));
return e;
}
}
组号
async function groupByID(approvers) {
const group = _.groupBy(approvers, 'ID');
return Object.keys(group).map(ID=> {
return group[ID].reduce((approvers, cur, idx) => ({
...approvers,
['NAME' + (idx + 1)]: cur.ID,
}), { ID});
})
最终功能
async function preparePayload() {
if(levels.length != 0 ){
let statement= `SELECT * FROM ITEMS `
list = await runquery(statement) ;
id = await groupByID(list) ;
}
let result={}
result.ID=id;
}
数据库的输出:[{ID:1,NAME:'F1'},{ID:2,NAME:'F2'},{ID:1,NAME:'F3'}]
预期输出:[{ID:1,NAME1:'F1',NAME2:'F2'},{ID:2,NAME:'F2'}]
但是输出并没有像预期的那样出现。
[{
"ID": "2"
},
{
"ID": "1"
}]
我猜这是由于函数执行的顺序,因为当我console.log(id)
按预期工作时,但是当我分配给结果变量时,它会给出意外的输出。
我不确定我是否正确地提出了问题。如果需要更详细,请告诉我。
解决方案
除了两个小改动外,我看不出您的代码有任何问题
- groupByID 不需要是异步的,因此不需要等待
['NAME' + (idx + 1)]: cur.ID,
需要改为['NAME' + (idx + 1)]: cur.NAME,
为简单起见,我删除了 db 调用并将其替换为返回您在帖子中提到的结果的 promise。
在此处查看工作代码 - https://repl.it/repls/PepperyGrossForms
它给了我这个结果
{
ID: [ { ID: '1', NAME1: 'F1', NAME2: 'F3' }, { ID: '2', NAME1: 'F2' } ]
}
希望这可以帮助。
推荐阅读
- selenium-webdriver - Crontab + Pipenv
- javascript - JavaScript - 如何在加载站点之前切换站点之间的时间间隔
- docker - NLog 控制台附加程序确实写入 .NET 中的 docker 日志
- c# - EF Core - 如何根据使用的数据库提供程序配置列类型
- java - 如何在 Android 的 EditText 中移动光标
- tensorflow2.0 - 将输入张量从 CPU 复制到 GPU 以运行 GatherVe 失败:Dst 张量未初始化。[操作:GatherV2]
- reactjs - 自定义 AmplifySignOut 的布局
- javascript - 如何在javascript中按id嵌套数据过滤和分组?
- c# - 如何在模型 csharp 中使用 DynamicObject
- html - 展开元素“向上”而不是“向下”