借鉴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
// 确保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
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
上次更新: 2022/7/26 下午2:33:39