Rumah >hujung hadapan web >tutorial js >Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?

Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?

青灯夜游
青灯夜游ke hadapan
2021-08-23 11:17:302165semak imbas

Bagaimana untuk melaksanakan baris gilir tugas tak segerak menggunakan JavaScript dan memproses semua tugas dalam baris gilir mengikut turutan? Artikel ini akan memperkenalkan kepada anda cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JavaScript.

Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?

Soalan

Terdapat keperluan untuk melaksanakan baris gilir tugas tak segerak dan memproses semua tugas dalam baris gilir mengikut turutan, seperti berikut :

  • Tambahkan tugas tak segerak pada baris gilir pada masa rawak

  • Tugas dalam baris gilir dilaksanakan secara berurutan mengikut masuk pertama, pertama -peraturan keluar

  • Tugas ialah permintaan tak segerak Tunggu satu pelaksanaan selesai sebelum melaksanakan yang seterusnya

Keperluan ini mudah. untuk melaksanakan menggunakan BlockingQueue dalam bahasa Java, tetapi JavaScript tidak mempunyai mekanisme penguncian. Ia tidak begitu mudah untuk dilaksanakan.

Pilihan 1

Mudah untuk difikirkan menggunakan penyelesaian tidak menyekat segerak untuk menyemak sama ada terdapat tugas dalam baris gilir pada masa tertentu selang. Kemudian keluarkan pemprosesan pertama. Selang pengesanan di sini ialah 500 milisaat dan setTimeout digunakan untuk mensimulasikan permintaan tak segerak.

<body>
  <button onclick="clickMe()">点我</button>
</body>
let queue = []
let index = 0
function clickMe() {
  queue.push({name: &#39;click&#39;, index: index++})
}

run()
async function run() {
  while (true) {
    if (queue.length > 0) {
      let obj = queue.shift()
      let res = await request(obj.index)
      console.log(&#39;已处理事件&#39; + res)
    } else {
      await wait(500)
      console.log(&#39;----- 队列空闲中 -----&#39;)
    }
  }
}
// 通过setTimeout模拟异步请求
function request(index) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      resolve(index)
    }, 1000)
  })
}
function wait(time) {
  return new Promise(function (resolve) {
    setTimeout(() => {
      resolve()
    }, time)
  })
}

Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?

Tetapi terdapat 2 masalah dengan penyelesaian ini.

  • Baris gilir terbiar masih diproses dalam satu gelung, menggunakan sumber
  • Selang pengesanan sukar difahami Jika selang terlalu panjang, tugas baris gilir tidak boleh diproses. dan selang pengesanan terlalu pendek, yang menggunakan sumber

Adakah terdapat cara untuk menyekat baris gilir apabila ia melahu, tanpa menggunakan sumber, seperti BlockingQueue di Java?

Pilihan 2

Idea utama:

  • Tambah permintaan tak segerak pada baris gilir dan apabila bilangan tugas dalam baris gilir lebih besar daripada 0, mula memproses Tugasan dalam baris gilir
  • Tunggu sehingga satu tugasan dilaksanakan sebelum melaksanakan tugas seterusnya
  • Selepas semua tugas dalam baris gilir diproses, status berjalan ditandakan sebagai palsu
<body>
<button onclick="clickMe()">点我</button>
</body>
// 异步请求队列
const queue = []
// 用来模拟不同的返回值
let index = 0
// 标志是否正在处理队列中的请求
let running = false

// 使用setTimeout模拟异步请求
function request(index) {
  return new Promise(function (resolve) {
    setTimeout(() => {
      resolve(index)
    }, 1000)
  })
}

// 连续点击,触发异步请求,加入任务队列
function clickMe() {
  addQueue(() => request(index++))
}

// 当队列中任务数大于0时,开始处理队列中的任务
function addQueue(item) {
  queue.push(item)
  if (queue.length > 0 && !running) {
    running = true
    process()
  }
}

function process() {
  const item = queue.shift()
  if (item) {
    item().then(res => {
      console.log(&#39;已处理事件&#39; + res)
      process()
    })
  } else {
    running = false
  }
}

Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?

Kesimpulan

Menggunakan ciri Janji bahawa ia akan sentiasa menyekat tanpa penyelesaian, anda boleh mencapai fungsi yang serupa dengan BlockingQueue Java, dan tugas tak segerak dilaksanakan mengikut urutan, dan baris gilir tidak menggunakan sumber apabila ia melahu.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !

Atas ialah kandungan terperinci Perbincangan ringkas tentang cara melaksanakan baris gilir tugas tak segerak menggunakan kaedah penyekatan JS?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam