责任链模式
背景交代
最近负责的一个前端项目随着需求和功能的升级,代码越写越复杂,尤其是登录模块的判断逻辑,就像是那老太太的缠脚布——又臭又长!
刚好趁着登录的需求变更,使用责任链模式把相关代码重构了一番,重构之后再看代码,啧啧,代码之整洁且逻辑清晰,忍不住要给自己送一朵小红花 🌺 —— 优秀!
撸起袖子加油干
我们约定好,将单个判断逻辑封装成一个函数,函数接收相同的参数,返回值的统一为一个 promise。
如果判断通过,可以进行下一步判断,返回 fulfill 状态的 promise,如果未通过需要结束后续判断,则返回 rejected 状态的 promise。
这里的代码均为示意代码,其中的判断逻辑都进行了简化。
1function handlePwdExpired (resp) {
2 if (resp.expired === 1) {
3 // 密码过期处理逻辑
4 console.log('密码过期,请修改密码后重新登录')
5 return Promise.rejected('密码过期')
6 }
7 return Promise.resolve(resp)
8}
9
10function handleAuthStatus (resp) {
11 if (resp.status === 1) {
12 return Promise.resolve(resp)
13 }
14 // 实名认证未通过处理逻辑
15 console.log('实名认证未通过,请耐心等待')
16 return Promise.rejected('实名认证未通过')
17}
18
19function handleDefault (resp) {
20 console.log('逻辑判断结束,进入系统')
21}
定义好上面处理策略之后,我们来调用
1// 假定我们已经拿到了响应
2const resp = {
3 status: 1,
4 expired: 1,
5}
6
7Promise.resolve(resp)
8 .then(resp => {
9 return handlePwdExpired(resp)
10 })
11 .then(resp => {
12 return handleAuthStatus(resp)
13 })
14 .then(resp => {
15 return handleDefault(resp)
16 })
17 .catch(err => {
18 console.log(err);
19 })