Rumah >hujung hadapan web >tutorial js >Melaksanakan konsep Golang defer ke dalam Javascript

Melaksanakan konsep Golang defer ke dalam Javascript

DDD
DDDasal
2024-12-19 14:23:09964semak imbas

Implementing Golang defer concept into Javascript

Dalam Go, pernyataan tangguh menangguhkan pelaksanaan fungsi sehingga fungsi sekeliling kembali. Berikut ialah contoh mudah:

package main

import "fmt"


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

Dalam contoh ini, fungsi utama dijalankan seperti biasa, tetapi semua fungsi tertunda dilaksanakan dalam susunan terbalik apabila fungsi itu keluar. SO outputnya ialah :

start
end
defer 2
defer 1

Kini, menambah kata kunci tangguh pada JavaScript memerlukan banyak usaha. Tetapi itulah yang saya suka tentang JS—ia sangat serba boleh sehingga anda boleh melaksanakan ciri daripada bahasa pengaturcaraan lain tanpa perlu menyentuh pengkompil.

Tetapi pertama, mengapa kita memerlukan ini?

Terdapat banyak kes penggunaan yang berguna untuk kefungsian seperti penangguhan dalam pengaturcaraan, seperti:

  • Pembersihan sumber: Bersihkan sumber seperti pemegang fail.
  • Operasi transaksi: Putar semula perubahan sekiranya berlaku ralat, seperti mengembalikan pangkalan data atau kemas kini keadaan.
  • Pengelogan: Tambahkan pengelogan pada penghujung operasi.
  • Pengurusan keadaan UI: Tetapkan semula keadaan selepas proses.

Dan senarai itu diteruskan...

Sekarang, mari kita selami bahagian yang menyeronokkan: pelaksanaan penangguhan kita dalam JavaScript.

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)

Output:

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

Seperti yang dijangka, fungsi tertunda dilaksanakan selepas fungsi utama selesai, dalam susunan terbalik.

Terima kasih,

Ahmad

Atas ialah kandungan terperinci Melaksanakan konsep Golang defer ke dalam Javascript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn