修饰器,实现各种免并发处理
- 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 | 互斥模式: |
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 | 互斥模式: |
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”
}
}