>웹 프론트엔드 >JS 튜토리얼 >Golang의 개념을 Javascript로 구현

Golang의 개념을 Javascript로 구현

DDD
DDD원래의
2024-12-19 14:23:09977검색

Implementing Golang defer concept into Javascript

Go에서 defer 문은 주변 함수가 반환될 때까지 함수 실행을 연기합니다. 다음은 간단한 예입니다.

package main

import "fmt"


func main() {
    fmt.Println("start")
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    fmt.Println("end")
}

이 예에서 main 함수는 정상적으로 실행되지만, 함수가 종료되면 모든 deferred 함수가 역순으로 실행됩니다. 따라서 출력은 다음과 같습니다.

start
end
defer 2
defer 1

이제 JavaScript에 defer 키워드를 추가하려면 많은 작업이 필요합니다. 하지만 제가 JS를 좋아하는 이유는 바로 이것이기 때문입니다. JS는 컴파일러를 건드릴 필요 없이 다른 프로그래밍 언어의 기능을 구현할 수 있을 정도로 다재다능합니다.

그런데 먼저 이것이 왜 필요한가요?

다음과 같이 프로그래밍에서 유사 연기 기능에 대한 유용한 사용 사례가 많이 있습니다.

  • 리소스 정리: 파일 핸들과 같은 리소스를 정리합니다.
  • 트랜잭션 작업: 데이터베이스 되돌리기 또는 상태 업데이트와 같은 오류 발생 시 변경 사항을 롤백합니다.
  • 로깅: 작업 종료 시 로깅을 추가합니다.
  • UI 상태 관리: 프로세스 후 상태를 재설정합니다.

그리고 목록은 계속됩니다...

이제 재미있는 부분인 JavaScript의 defer 구현에 대해 살펴보겠습니다.

class Deferer {
  static stack = [];
  static wrapped = false;
  static defer(fn) {
    this.stack.push(fn);
    if (!this.wrapped) {
        throw new Error("can't 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)

출력:

Start of function 8 8 8
End of function 8 8 8
Deferred: Function 2
Deferred: Function 1

예상대로 지연된 함수는 주 함수가 완료된 후 역순으로 실행됩니다.

감사합니다.

아흐메드

위 내용은 Golang의 개념을 Javascript로 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.