Skip to content

Commit 6c23855

Browse files
committed
event-queue
1 parent 0d322b4 commit 6c23855

File tree

7 files changed

+264
-61
lines changed

7 files changed

+264
-61
lines changed

.editorconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# http://editorconfig.org
2+
root = true
3+
4+
[*]
5+
charset = utf-8
6+
indent_style = space
7+
indent_size = 2
8+
end_of_line = lf
9+
insert_final_newline = true
10+
trim_trailing_whitespace = true
11+
12+
[*.md]
13+
insert_final_newline = false
14+
trim_trailing_whitespace = false

.eslintignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
dist/
2+
node_modules
3+
iconfont.js
4+
common-module/

.eslintrc.json

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"parserOptions": {
3+
"parser": "babel-eslint",
4+
"ecmaVersion": 2017,
5+
"ecmaFeatures": {
6+
"implied": true
7+
},
8+
"sourceType": "module"
9+
},
10+
"env": {
11+
"es6": true,
12+
"node": true,
13+
"browser": true
14+
},
15+
"extends": [
16+
"airbnb-base",
17+
"plugin:vue/essential"
18+
],
19+
"rules": {
20+
"prefer-destructuring": 0,
21+
"destructuring": 0,
22+
"no-useless-escape": 0,
23+
"prefer-rest-params": 0,
24+
"no-restricted-globals": 0,
25+
"no-param-reassign": 0,
26+
"no-console": 0,
27+
"no-underscore-dangle": 0,
28+
"class-methods-use-this": 0,
29+
"no-tabs": 0,
30+
"camelcase": 0,
31+
"no-plusplus": 0,
32+
"no-new": 0,
33+
"no-use-before-define": 0,
34+
"func-names": 0,
35+
"prefer-const": 1,
36+
"no-return-assign": 1,
37+
"eqeqeq": 1,
38+
"no-shadow": 1,
39+
"no-restricted-syntax": 0,
40+
"no-debugger": 0,
41+
"import/no-dynamic-require": 0,
42+
"one-var": 0,
43+
"radix": 0,
44+
"consistent-return": 1,
45+
"no-unused-expressions": 1,
46+
"no-unused-vars": 1,
47+
"prefer-promise-reject-errors": 0,
48+
"linebreak-style": 0,
49+
"arrow-body-style": 0,
50+
"global-require": 0,
51+
"array-callback-return": 0,
52+
"import/no-unresolved": 0,
53+
"no-bitwise": [
54+
2,
55+
{
56+
"allow": [
57+
"~",
58+
"&"
59+
]
60+
}
61+
],
62+
"import/no-extraneous-dependencies": [
63+
0,
64+
{
65+
"devDependencies": true
66+
}
67+
],
68+
"no-mixed-operators": 0,
69+
"guard-for-in": 0,
70+
"no-multi-assign": 1,
71+
"max-len": 0,
72+
"vue/no-side-effects-in-computed-properties": 1,
73+
"vue/require-v-for-key": 1
74+
}
75+
}

.gitignore

Lines changed: 9 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,10 @@
1-
# Logs
2-
logs
3-
*.log
4-
npm-debug.log*
5-
yarn-debug.log*
6-
yarn-error.log*
1+
/node_modules
2+
/npm-debug.log
3+
/app/logs
4+
node_modules/**
5+
.*/**
6+
dist
7+
package-lock.json
8+
*.lock
9+
*.bak.*
710

8-
# Runtime data
9-
pids
10-
*.pid
11-
*.seed
12-
*.pid.lock
13-
14-
# Directory for instrumented libs generated by jscoverage/JSCover
15-
lib-cov
16-
17-
# Coverage directory used by tools like istanbul
18-
coverage
19-
20-
# nyc test coverage
21-
.nyc_output
22-
23-
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24-
.grunt
25-
26-
# Bower dependency directory (https://bower.io/)
27-
bower_components
28-
29-
# node-waf configuration
30-
.lock-wscript
31-
32-
# Compiled binary addons (https://nodejs.org/api/addons.html)
33-
build/Release
34-
35-
# Dependency directories
36-
node_modules/
37-
jspm_packages/
38-
39-
# TypeScript v1 declaration files
40-
typings/
41-
42-
# Optional npm cache directory
43-
.npm
44-
45-
# Optional eslint cache
46-
.eslintcache
47-
48-
# Optional REPL history
49-
.node_repl_history
50-
51-
# Output of 'npm pack'
52-
*.tgz
53-
54-
# Yarn Integrity file
55-
.yarn-integrity
56-
57-
# dotenv environment variables file
58-
.env
59-
60-
# next.js build output
61-
.next

README.md

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,27 @@
1-
# event-queue
1+
# event-queue
2+
3+
用来控制事件(异步或者同步)的管理
4+
5+
## Use
6+
7+
- maxEventNumber:{number} 允许最大并行任务数量,默认为5
8+
- async:{boolean} 是否需要异步执行,默认false
9+
- breakRun:{function} 用于中断继续向执行队列中添加任务,返回false(默认是false)表示继续添加
10+
11+
```javascript
12+
import EventQueue from './index';
13+
const eventQueue = new EventQueue();
14+
const eventList = [];
15+
const eventArr = new Array(46).join(',').split(',');
16+
eventArr.map(() => {
17+
// 模拟事件发生
18+
eventList.push(() => {
19+
setTimeout(() => {
20+
// do something...
21+
// 调用完成标记, 通知执行下一个任务
22+
eventQueue.done();
23+
}, 6000 * Math.random());
24+
});
25+
});
26+
eventQueue.add(taskList).run();
27+
```

index.js

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/**
2+
* 事件队列
3+
* 1.可以控制事件发生的最大并行数
4+
* 2.打断队列中后续任务的添加,breakRun(eventOptions)来控制
5+
* 3.允许在队列在执行过程中,继续向队列添加任务
6+
* TO DO:
7+
* 1.完成回调/执行结果返回,目前可以直接在外部处理结果
8+
* 2.异常检查:对某些特殊错误进行检查
9+
* 3.暂停/取消/销毁
10+
* */
11+
12+
const OPTIONS = {
13+
// 任务同时执行的最大个数
14+
maxEventNumber: 5,
15+
// 队列任务是否并行(异步)执行。
16+
// 注意:把maxEventNumber设置为1, async则不会起作用,此时本质上是同步
17+
async: true,
18+
// 用于中断继续向执行队列中添加任务,返回false(默认是false)表示继续添加
19+
breakRun() {},
20+
// TO DO 单个任务完成后执行,目前来说没必要,外部可以自由控制
21+
complete() {},
22+
// TO DO 所有任务完成后执行,目前来说没必要,外部可以自由控制
23+
completeAll() {},
24+
};
25+
26+
function fixedMaxEventNumber(number) {
27+
return isNaN(number) || number <= 0 ? OPTIONS.maxEventNumber : number;
28+
}
29+
30+
function EventQueue(options) {
31+
this.init(options);
32+
}
33+
34+
EventQueue.prototype = {
35+
constructor: EventQueue,
36+
/**
37+
* 初始化实例配置
38+
* */
39+
init(options = {}) {
40+
this.options = { ...OPTIONS, ...options };
41+
// 修正maxEventNumber,防止报错
42+
this.options.maxEventNumber = fixedMaxEventNumber(this.options.maxEventNumber);
43+
// 事件队列合集
44+
this.eventList = [];
45+
// 正在执行的事件个数
46+
this.eventRunNumber = 0;
47+
// 已经完成的事件个数
48+
this.eventOverNumber = 0;
49+
},
50+
/**
51+
* 队列中单个任务结束标识
52+
* 队列中函数结束时,需要手动调用此标识结束。
53+
* 外部创建队列时使用
54+
* */
55+
done() {
56+
// 计数
57+
this.eventRunNumber -= 1;
58+
this.eventOverNumber += 1;
59+
this.run();
60+
},
61+
/**
62+
* 把方法推送到队列中
63+
* */
64+
add(eventList) {
65+
if (typeof eventList === 'function') eventList = [eventList];
66+
if (eventList && eventList.length > 0) {
67+
eventList.map((event) => {
68+
this.on(event);
69+
});
70+
}
71+
return this;
72+
},
73+
on(event) {
74+
this.eventList.push(event);
75+
},
76+
/**
77+
* 执行待执行队列(eventList)中的任务
78+
* 执行队列中的任务不超过maxEventNumber值
79+
* */
80+
run() {
81+
const {
82+
eventList,
83+
eventRunNumber,
84+
eventOverNumber,
85+
options,
86+
} = this;
87+
// 如果正在执行的队列超过限制,则中断
88+
if (eventRunNumber >= options.maxEventNumber) return;
89+
const eventIndex = eventRunNumber + eventOverNumber;
90+
// 即将执行的任务
91+
const event = eventList[eventIndex];
92+
// 没有任务,执行完了
93+
if (!event) return;
94+
if (options.breakRun && options.breakRun({ eventRunNumber, eventOverNumber })) return;
95+
// 执行当前任务
96+
this.emit(event);
97+
// 执行下一个任务
98+
this.eventRunNumber += 1;
99+
this.run();
100+
},
101+
emit(event) {
102+
if (this.options.async) {
103+
setTimeout(() => {
104+
event.apply(this, arguments);
105+
}, 6);
106+
} else {
107+
event.apply(this, arguments);
108+
}
109+
},
110+
};
111+
112+
export default EventQueue;

package.json

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"name": "rsk-common-module",
3+
"version": "1.0.0",
4+
"description": "",
5+
"scripts": {
6+
"precommit-msg": "echo 'Pre-commit checks.........' && exit 0",
7+
"lint": "eslint --ext .js --ext .vue ./ --fix && git add ."
8+
},
9+
"pre-commit": [
10+
"precommit-msg",
11+
"lint"
12+
],
13+
"license": "ISC",
14+
"dependencies": {},
15+
"devDependencies": {
16+
"babel-eslint": "^10.0.1",
17+
"eslint": "^5.16.0",
18+
"eslint-config-airbnb-base": "^13.1.0",
19+
"eslint-plugin-import": "^2.16.0",
20+
"eslint-plugin-vue": "^5.2.2",
21+
"pre-commit": "^1.2.2"
22+
}
23+
}

0 commit comments

Comments
 (0)