Node async / await中功能执行的顺序

时间:2019-12-21 17:03:28

标签: node.js lodash

我不确定要确保这些函数按顺序运行,并且将第一次调用的结果用于第二次调用。

数据库功能

async runquery(){
 try {
            ...
            const results = await db.statementExecPromisified(statement, []);                 
            return results; 

        } catch (e) {
                console.log("Error - " +JSON.stringify(e));
                return e;
        }
}

组ID

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;
}

DB的输出:[{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)时可以按预期工作,但是当我将其分配给 result 变量时,它将产生意外的输出。

我不确定我是否正确提出了这个问题。请让我知道是否需要更多细节。

1 个答案:

答案 0 :(得分:0)

除了两个小小的改动外,我的代码没有其他问题

  • groupByID不需要异步,因此不需要等待
  • ['NAME' + (idx + 1)]: cur.ID,需要更改为['NAME' + (idx + 1)]: cur.NAME,

为简单起见,我删除了db调用,并用一个promise替换了它,该promise返回您在帖子中提到的结果。

在此处查看工作代码-https://repl.it/repls/PepperyGrossForms

它给了我这个结果

{
  ID: [ { ID: '1', NAME1: 'F1', NAME2: 'F3' }, { ID: '2', NAME1: 'F2' } ]
}

希望这会有所帮助。