多个异步任务,顺序执行

项目要求: 服务端需要利用多个sql语句, 查询出多个结果, 要求多个结果一次性返回
呐呐呐~ 于是某个傻白甜就开干了…
以为, 将 res,send()只写在最后一个 pool.query(..);里, 将数据一起返回给前端即可多个异步任务,顺序执行
只能说 ,很傻很天真 ╮(╯▽╰)╭
最直观结果就是, 页面刷新, 发现每次不是这里一块空白, 就是那里一块空白,有时干脆啥也没有…
反省中… ε=(´ο`*)))唉
问题: 测试接口, 返回结果为空,或者不完整, 每次返回结果不一
原因: pool.query(..);是异步的, res.send()不会等待

知道了问题所在就好办多了

方法一:回调函数嵌套

因为pool.query(..);本身不支持promise , 所以*使用回调地狱嵌套, 将第下个查询放在上个查询的回调函数内
这样写虽然可以解决需求 (具体代码,太恶心,我就不展示了…)
但问题在于:

  1. 代码丑,冗杂,难维护
  2. 这几个查询,相互没有依赖性,原来可以并行的,结果这样写变成了串行,效率低

方法二:Promise并发

步骤一:封装Promise

多个异步任务,顺序执行

要点:
  1. 将每个查询封装成一个Promise函数,这样就可以使用.then(),避免嵌套太深
  2. 使用Promise.all([....]).then(...)的方式 ,使多个Promise函数并发, 结果一起返回

问题: 以上已经简化很多,但发现还是存在大段相类似的代码
思路:

  1. 想办法, 看能不能去调整成完全相同的形式
  2. 看看能不能把 相同的代码部分, 封装成一个函数

步骤二:调整代码

多个异步任务,顺序执行

要点:
  1. 将每个Promise函数得到的result, 都通过resolve(result)传递, 最终一起数组的形式呈现在, 最后的.then(result)中, result=[a,b,c,d,e,f]中元素的顺序与Promise.all([....])中各个Promise函数排序一致
  2. 数组解构

步骤三:封装函数

多个异步任务,顺序执行

封装成功: 代码确实简化不少 ✿✿ヽ(°▽°)ノ✿

这里我们需要注意下: (前端接收时)

  1. 步骤一中,我们返回的result数据是对象;
  2. 步骤二和步骤三中,我们返回的result数据是数组;

方法三:es7

多个异步任务,顺序执行

要点:
  1. 在方法二的基础上, 将Promise.all([....]).then(...)用匿名函数(aysnc function(){.......}()包裹
  2. 去掉.then(..),使用关键字await代替
不但代码量少, 还让异步的任务,像同步一样执行,优秀~ ✿✿ヽ(°▽°)ノ✿