借鉴Promise原理实现题目
# 借鉴Promise原理实现题目
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const subFlow = createFlow([() => delay(1000).then(() => console.log("c"))]);
createFlow([
() => console.log("a"),
() => console.log("b"),
subFlow,
[() => delay(1000).then(() => console.log("d")),
() => console.log("e")],
]).run(() => {
console.log("done");
});
// 需要按照 a,b,延迟1秒,c,延迟1秒,d,e, done 的顺序打印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 确保createFlow(fns)的参数fns全部执行完毕,才执行run(cb)的cb
function createFlow(arr = []) {
const args = [...arguments].flat(Infinity);
if (!(this instanceof createFlow)) {
return new createFlow(...args);
}
this.run = (callback) => {
while (args.length) {
const task = args.shift();
const next = () => createFlow(args).run(callback);
if (typeof task === 'function') {
const res = task();
if (res?.then) {
res.then(next);
return;
}
} else if (task?.isFlow) {
task.run(next);
return;
}
}
callback?.();
}
}
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const subFlow = createFlow([() => delay(1000).then(() => console.log("c"))]);
createFlow([
() => console.log("a"),
() => console.log("b"),
subFlow,
[() => delay(1000).then(() => console.log("d")), () => console.log("e")],
]).run(() => {
console.log("done");
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const createFlow = (list) => {
const sources = [...list]?.flat();
const run = async function(callback) {
for(let i = 0; i < sources.length; i++) {
if(sources[i]?.run) {
await sources[i].run();
} else {
await sources[i]?.();
}
}
callback?.()
}
return {
sources,
run
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17