ホームページ >ウェブフロントエンド >jsチュートリアル >Golang の遅延概念を Javascript に実装する

Golang の遅延概念を Javascript に実装する

DDD
DDDオリジナル
2024-12-19 14:23:09965ブラウズ

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 関数は通常どおり実行されますが、関数が終了すると、すべての遅延関数が逆の順序で実行されます。したがって、出力は次のようになります:

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。