串行化的滥用
案例一
// 改写前
async getUserInfo (id) {
// const userModel = ***
// const userRoleModel = ***
// 1、获取用户信息
const user = await userModel.find({ where: { id });
// 2、获取角色信息
const userRole = await userRoleModel.find({ where: uid: id}) ;
//***
return Object.assign({}, user, userRole);
}
// 改写后
async getUserInfo (id) {
// const userModel = ***
// const userRoleModel = ***
// 1、获取用户信息
const userPromise = userModel.find({ where: { id }); // (Sequelize)返回的是Promise对象
// 2、获取角色信息
const userRolePromise = userRoleModel.find({ where: uid: id}) ;
const user = await userPromise;
const userRole = await userRolePromise;
//***
return Object.assign({}, user, userRole);
}
注解:
1、上述写法第2步 “获取角色信息” 需等待第1步 “获取用户信息” 执行完成后才能执行。第1步与第2步的执行流程是串行的(改写前)。
2、事实上本示例中第2步并不依赖第1步返回的结果。可以让第1步与第2步并行执行提高效率(改写后)。
案例2
async getAllUserInfo (ids) {
// const userModel = ***
if (ids instanceof Array) {
// 串行
let userList = ids.map(async function(id, index, arr) {
return await userModel.find({ where: { id } });
});
// 并行
const promises = ids.map(function(id, index, arr) {
return userModel.find({ where: { id } });
});
userList = await Promise.all(promises);
}
}