noConcurrent

修饰器,实现各种免并发处理

Source:

Methods

(static) makeMutex(namespace, mutexId, mode, discardRes)

Source:

多函数免并发,具有相同互斥标识的函数不会并发执行

Example
import {makeMutex} from 'fancy-mini/lib/decorators';

let globalStore = {};

class Navigator {
   @makeMutex({namespace:globalStore, mutexId:'navigate'}) //避免跳转相关函数并发执行
   static async navigateTo(route){...}

   @makeMutex({namespace:globalStore, mutexId:'navigate'}) //避免跳转相关函数并发执行
   static async navigateToMiniProgram(route){...}
}
Parameters:
Name Type Description
namespace Object

互斥函数间共享的一个全局变量,用于存储并发信息

mutexId string

互斥标识,具有相同标识的函数不会并发执行

mode string

互斥模式:
discard - 丢弃模式(默认),无视后续并发操作,场景示例:用户连续快速多次点击同一按钮,只执行一次监听函数,无视后续并发点击;
merge - 合并模式,共享执行结果,场景示例:页面中多处同时触发登录过程,只执行一次登录流程,后续并发请求直接共享该次登录流程执行结果;
wait - 等待模式,依次顺序执行,场景示例:页面中多处同时调用弹窗函数,一次只展示一个弹窗,用户关闭后再展示第二个,依次顺序展示

discardRes *

(丢弃模式)被丢弃时函数返回结果

(static) makeNoConcurrent(mode, discardRes)

Source:

免并发修饰器模板

Example
class Demo {
  @makeNoConcurrent({ //免并发处理
    mode: 'discard', //并发调用时,无视后续调用
    discardRes: { //被无视时返回的指定错误信息
      succeeded: false,
      errMsg: 'discarded: invoke too frequently'
    }
  })
  async func(){
  
  }
}
Parameters:
Name Type Description
mode string

互斥模式:
discard - 丢弃模式,无视后续并发操作,场景示例:用户连续快速多次点击同一按钮,只执行一次监听函数,无视后续并发点击;
merge - 合并模式,共享执行结果,场景示例:页面中多处同时触发登录过程,只执行一次登录流程,后续并发请求直接共享该次登录流程执行结果;
wait - 等待模式,依次顺序执行,场景示例:页面中多处同时调用弹窗函数,一次只展示一个弹窗,用户关闭后再展示第二个,依次顺序展示

discardRes *

(丢弃模式)被丢弃时函数返回结果

(static) mergingStep()

Source:

步骤并合修饰器,避免公共步骤重复并发执行
将公共步骤单例化:若步骤未在进行,则发起该步骤;若步骤正在进行,则监听并使用其执行结果,而不是重新发起该步骤

Example
class Demo {
  @mergingStep //该函数可并合执行,短时间内连续多次调用可以共享执行结果
  async login(){
   //...
  }
  
  test(){
    //页面内同时发生如下三个请求: 登录-发送接口A、登录-发送接口B、登录-发送接口C
   
    //未使用本修饰器时,网络时序:登录,登录,登录 - 接口A,接口B,接口C, 登录请求将会被发送三次
    //使用本修饰器时,网络时序:登录 - 接口A,接口B,接口C,登录请求只会被发送一次
  }
}

(static) noConcurrent()

Source:

免并发修饰器,在上一次操作结果返回之前,不响应重复操作

Example
class Demo {
  //提交表单
  @noConcurrent //表单提交期间,无视后续点击,避免用户连续多次点击同一个提交按钮,造成同时提交多份表单
  async onSubmit(){
    //...
  }
}

(static) singleAisle()

Source:

单通道修饰器,使得并发调用逐个顺序执行

Example
class Demo {
  //展示弹窗
  @singleAisle //并发调用时需依次执行
  async popDialog({msg}){
    //展示弹窗
    //await 等待弹窗交互
    //关闭弹窗,return
  }
  
  test(){
    //页面中多处同时调用弹窗函数
    this.popDialog({msg: '提示a'});
    this.popDialog({msg: '提示b'});
    this.popDialog({msg: '提示c'});
    
    //未使用本修饰器时,执行效果:多个弹窗同时展现相互覆盖,用户只看到了“提示c”
    //使用本修饰器时,执行效果:展示“提示a”->用户关闭->展示“提示b”->用户关闭->展示“提示c”
  }
}