1.0.17 • Published 11 months ago
@oawu/queue v1.0.17
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