ホームページ >ウェブフロントエンド >jsチュートリアル >Golang の遅延概念を 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 は非常に多用途であり、コンパイラーを触らなくても他のプログラミング言語の機能を実装できます。
しかしまず、なぜこれが必要なのでしょうか?
プログラミングにおける遅延のような機能には、次のような便利な使用例がたくさんあります。
リストは続きます...
それでは、楽しい部分、つまり 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 サイトの他の関連記事を参照してください。