1.0.17 • Published 11 months ago

@oawu/queue v1.0.17

Weekly downloads
10
License
MIT
Repository
github
Last release
11 months ago

OA's Node.js Queue

排排站吧,你們這些傢伙! 🚗… 🚗… 🚗…

說明

將須同步處理的事件或功能,以 Queue 的方式依序處理,或許大家會採用 Promise 的方式處理同步問題,但如果各個 Promise 是需要先後順序或者相依的參數,那可以參考本套件喔!

安裝

npm install @oawu/queue

使用

定義要執行的 function,依照 enqueue 進去的順序執行,當事件執行完後,呼叫 next 來執行下一個 enqueue

其執行的順序主要就是依據被 enqueue 的先後順序,如下範例則會依序執行 queue 1, queue 2, queue 3, queue 4

queue 4 在程式碼中雖然是先定義了,但因為 timeout 關係,所以會被最晚 enqueue,故會最後執行。

  const Queue = require('@oawu/queue.js')
  const queue = new Queue()

  // define queue 1
  queue.enqueue(next => {

    setTimeout(() => { // someAsyncFunction
      next({ a: 1 }) // someAsyncFunction Finish! pass data to next queue
    }, 1000)
  })
  
  // define queue 2
  queue.enqueue((next, lastParams) => {
    console.log(lastParams) // { a: 1 }

    setTimeout(() => { // someAsyncFunction
      next({ a: 2 }) // someAsyncFunction Finish! pass data to next queue
    }, 1000)
  })

  setTimeout(() => {
    // define queue 4
    queue.enqueue((next, lastParams) => {
      console.log(lastParams) // { a: 3 }
    })
  }, 5000)
  
  setTimeout(() => {
    // define queue 3
    queue.enqueue((next, lastParams) => {
      console.log(lastParams) // { a: 2 }

      next({ a: 3 }) // someAsyncFunction Finish! pass data to next queue
    })
  }, 1000)

物件

共享,@oawu/queue 內有預設的共用物件,簡單或需共用的環境下可以直接使用,如下範例:

  const Queue = require('@oawu/queue.js')
  const queue = Queue()

  queue.enqueue(next => {
    // ...
  })

大小,@oawu/queue 可以使用 size 取得目前剩正在執行與餘未執行的事件,如下範例:

  const Queue = require('@oawu/queue.js')
  const queue = Queue.create()

  queue.enqueue(next => {
    console.log(queue.size)
  })

清空,@oawu/queue 可以使用 clean 將目前剩餘未執行的事件全部清空,並且結束執行,直到有新的事件 enqueue,如下範例:

  const Queue = require('@oawu/queue.js')
  const queue = new Queue()

  queue.enqueue(next => {
    queue.clean()
  })

  queue.enqueue(next => {
    // ... 不會被執行
  })

Queue.Dispatch

這是一個可以不斷往 Queue 丟的的功能,並且指定幾個 worker 處理任務 如下範例:

  const Queue = require('@oawu/queue.js')
  const dispatchQueue = Queue.Dispatch(3) // 指定 3 個 worker 執行任務
  
  dispatchQueue
    .enqueue(next => {
      console.error('enqueue 1')
      setTimeout(next, 2000)
    })
    .enqueue(next => {
      console.error('enqueue 2')
      setTimeout(next, 1000)
    })
    .enqueue(next => {
      console.error('enqueue 3')
      setTimeout(next, 1300)
    })
    .enqueue(next => {
      console.error('enqueue 4')
      setTimeout(next, 2000)
    })
    .enqueue(next => {
      console.error('enqueue 5')
      setTimeout(next, 100)
    })
  
  dispatchQueue
    .exec(_ => { // 開始執行以上任務
      console.error('ok')
    })

  // 以上 1、2、3 會非同步併發執行,而 2 會先結束,接著會加入執行 4,等 3 結束後執行 5,所以依序如下:
    // 1 2 3
    // 1 3 4
    // 1 4 5
    // 1 4
    // 4
1.0.17

11 months ago

1.0.16

11 months ago

1.0.15

11 months ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

4 years ago

1.0.10

5 years ago

1.0.9

5 years ago

1.0.8

5 years ago

1.0.7

5 years ago

1.0.6

5 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago