责任链模式

背景交代

最近负责的一个前端项目随着需求和功能的升级,代码越写越复杂,尤其是登录模块的判断逻辑,就像是那老太太的缠脚布——又臭又长!

刚好趁着登录的需求变更,使用责任链模式把相关代码重构了一番,重构之后再看代码,啧啧,代码之整洁且逻辑清晰,忍不住要给自己送一朵小红花 🌺 —— 优秀!

撸起袖子加油干

我们约定好,将单个判断逻辑封装成一个函数,函数接收相同的参数,返回值的统一为一个 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  })