1.0.1 • Published 4 years ago

@zjxpcyc/use-async v1.0.1

Weekly downloads
-
License
MulanPSL
Repository
-
Last release
4 years ago

use-async

在目前主流的 MVVM 框架, vuereact 中有一个通病或者痛点: 业务的逻辑被分散在各个文件中。

比如 react 如果跟 redux 搭配, 那么业务流程的控制,可能 redux 中有一部分, 涉及 state 的业务更新逻辑。 react 中有一部分, 涉及事件的响应逻辑。

很多的时候, 我们往往会强制要求, 业务逻辑必须怎么怎么写, 放到哪个文件里面。但是遇到异步的, 业务操作是连续的时候,这种规定往往不经意间就被打破。

比如有一种任务提交流程

1 -> 是否提交 ?

这种处理还好做, 非常简单, 一行代码估计就搞定

2 -> 选择提交模板

这种可能需要涉及事件处理, 需要响应用户的操作。 实际代码层面, 这个业务流程就断了。

3 -> 选择提交的说明

这种也是如此, 响应用户操作

4 -> 各种提参校验, 最后提交

上面列举的步骤其实很简答。但是涉及的变量和状态控制, 可能不少于 7-8 个。

如果再涉及到 组件生命周期 的处理, 代码只会更分散。往往一个流程,要翻遍几乎所有的核心文件目录, 什么 componet, store, services 等等。

因此 use-async 就应运而生了。当然 use-async 只是解决这个痛点的一种方案, 并不是万金油。使用之前,还需要开发者自己衡量一下。

安装

npm install -S @zjxpcyc/use-async

使用

import useAsync from '@zjxpcyc/use-async'

// 这里以伪代码的方式解决刚刚示例痛点
handleSubmit = async () => {
  // 1. 是否提交
  wait useAsync(

    // useAsync 有2个参数
    // 第一个是需要执行逻辑的函数
    // 该函数的第一个参数有 next, cancel 两个属性
    // next 是流程继续, cancel 是流程结束
    ({ next, cancel }, isSubmit) => {
      if (isSubmit) next();
    },
    
    // 第二个参数是一个 setter
    // 用来将你写的函数绑定到当前对象上, 以便后面事件绑定
    // 比如本例, handleConfirmModal 将会被如下的形式绑定
    // <Confirm onSubmit={(isSubmit) => { this.handleConfirmModal(isSubmit) }}>
    fn => (this.handleConfirmModal = fn)
  )

  // 2. 选择提交模板
  // 先打开弹窗
  this.setState({ showTemplate: true })

  // 这里演示里 useAsync 的第二种用法
  // 第一个参数是一个事件函数的名称, 第二个是当前组件
  // 也就是说 handleTemplateCheck 会在某个地方被定义
  // 支持这种方式的原因是, 可能业务逻辑跟基本的事件处理是不同文件
  // 这种方式会将原来的事件函数给替换掉, 但是不影响原来的代码逻辑
  // 同时新增一个对应的 Cancel 函数来处理相反的流程
  // 假设 handleTemplateCheck 是如下代码
  // handleTemplateCheck = ({next}, template) => { this.setState({ template, showTemplate: false }, next) }
  // 这个示例中 componentInstance 会被绑定一个 handleTemplateCheckCancel 方法
  wait useAsync('handleTemplateCheck', componentInstance)

  // 3. 提交文件说明
  this.setState({ showDesc: true })
  wait useAsync('handleDesChange', componentInstance)

  // 4. 验证提交
  // some code ...
}

上述演示, 很好的解决了因为异步逻辑造成的代码阻断. 同时也减少了代码耦合, 实现了关注点分离。 如果跟 redux 这种样板代码很多的框架组合, 如果 redux 可以再封装一层通用层, 甚至可以直接解放大部分的 redux 的样板代码。

最后

这个小的 lib 还有很多不足, 后期会继续跟进优化