多个异步任务,顺序执行
项目要求: 服务端需要利用多个sql语句, 查询出多个结果, 要求多个结果一次性返回
呐呐呐~ 于是某个傻白甜就开干了…
以为, 将 res,send()
只写在最后一个 pool.query(..);
里, 将数据一起返回给前端即可
只能说 ,很傻很天真 ╮(╯▽╰)╭
最直观结果就是, 页面刷新, 发现每次不是这里一块空白, 就是那里一块空白,有时干脆啥也没有…
反省中… ε=(´ο`*)))唉
问题: 测试接口, 返回结果为空,或者不完整, 每次返回结果不一
原因: pool.query(..);
是异步的, res.send()
不会等待
知道了问题所在就好办多了
方法一:回调函数嵌套
因为pool.query(..);
本身不支持promise , 所以被迫使用回调地狱嵌套, 将第下个查询放在上个查询的回调函数内
这样写虽然可以解决需求 (具体代码,太恶心,我就不展示了…)
但问题在于:
- 代码丑,冗杂,难维护
- 这几个查询,相互没有依赖性,原来可以并行的,结果这样写变成了串行,效率低
方法二:Promise并发
步骤一:封装Promise
要点:
- 将每个查询封装成一个
Promise函数
,这样就可以使用.then()
,避免嵌套太深 - 使用
Promise.all([....]).then(...)
的方式 ,使多个Promise函数
并发, 结果一起返回
问题: 以上已经简化很多,但发现还是存在大段相类似的代码
思路:
- 想办法, 看能不能去调整成完全相同的形式
- 看看能不能把 相同的代码部分, 封装成一个函数
步骤二:调整代码
要点:
- 将每个
Promise函数
得到的result
, 都通过resolve(result)
传递, 最终一起数组的形式呈现在, 最后的.then(result)
中,result=[a,b,c,d,e,f]
中元素的顺序与Promise.all([....])
中各个Promise函数
排序一致 - 数组解构
步骤三:封装函数
封装成功: 代码确实简化不少 ✿✿ヽ(°▽°)ノ✿
这里我们需要注意下: (前端接收时)
- 步骤一中,我们返回的result数据是对象;
- 步骤二和步骤三中,我们返回的result数据是数组;
方法三:es7
要点:
- 在方法二的基础上, 将
Promise.all([....]).then(...)
用匿名函数(aysnc function(){.......}()
包裹 - 去掉
.then(..)
,使用关键字await
代替