将 Golang 延迟概念实现到 Javascript 中

来源:undefined 2025-01-22 01:15:32 1037

在 go 中,defer 语句推迟函数的执行,直到周围的函数返回。这是一个简单的例子:

1

2

3

4

5

6

7

8

9

10

11

package main

import "fmt"

func main() {

fmt.println("start")

defer fmt.println("defer 1")

defer fmt.println("defer 2")

fmt.println("end")

}

登录后复制

在这个例子中,主函数正常执行,但所有延迟函数在函数退出时都以相反的顺序执行。所以输出将是:

1

2

3

4

start

end

defer 2

defer 1

登录后复制

现在,向 javascript 添加 defer 关键字需要大量工作。但这就是我喜欢 js 的原因 - 它是如此通用,您可以实现其他编程语言的功能,而无需接触编译器。

但首先,我们为什么需要这个?

编程中类似延迟的功能有许多有用的用例,例如:

资源清理:清理文件句柄等资源。 事务操作:在发生错误时回滚更改,例如恢复数据库或状态更新。 日志记录:在操作结束时添加日志记录。 ui 状态管理:处理后重置状态。

这样的例子还在继续......

立即学习Java免费学习笔记(深入)”;

现在,让我们深入了解有趣的部分:我们在 javascript 中实现 defer。

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

39

40

41

42

43

44

45

46

47

class deferer {

static stack = [];

static wrapped = false;

static defer(fn) {

this.stack.push(fn);

if (!this.wrapped) {

throw new error("cant call defer wihtout wrapping the function with deferer.wrapper")

}

}

static execute() {

while (this.stack.length > 0) {

const fn = this.stack.pop();

try {

fn();

} catch (err) {

throw new error(error in deferred function:, err);

}

}

this.wrapped = false;

}

static wrapper = (cp) => (...args) => {

if(this.wrapped) throw new error("nested deferers are not supported");

this.wrapped = true;

try {

const v = cp(...args)

this.execute()

return v;

} finally {

this.wrapped = false;

}

}

}

const mydeferedfunction =deferer.wrapper((a, b, c) => {

console.log("start of function", a, b, c);

deferer.defer(() => console.log("deferred: function 1"));

deferer.defer(() => console.log("deferred: function 2"));

console.log("end of function", a, b, c);

});

mydeferedfunction(8,8,8)

登录后复制

输出:

1

2

3

4

Start of function 8 8 8

End of function 8 8 8

Deferred: Function 2

Deferred: Function 1

登录后复制

正如预期的那样,延迟函数在主函数完成后以相反的顺序执行。

谢谢,

艾哈迈德

最新文章