首页 > 解决方案 > 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)按预期工作时,但是当我分配给结果变量时,它会给出意外的输出。

我不确定我是否正确地提出了问题。如果需要更详细,请告诉我。

标签: node.jslodash

解决方案


除了两个小改动外,我看不出您的代码有任何问题

  • 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' } ]
}

希望这可以帮助。


推荐阅读