
pors
是一個簡單的批次執行排程系統,能夠批量處理函式,這模式有很多人做過了,但都不能夠同時兼任棋子和塞子的角色,所以又花了一點時間做了這個。
pawn
是一個常駐物件,你可以不斷推送執行續給pawn
,它會直接執行,若超過同步執行量則會限制同步運行的數量。
import{pawn}from'pors'letcount=0pawn(2)// 一次允許的執行量,無填入則不會限制.add(done=>{setTimeout(()=>{count+=1done()},1000)}).add(done=>{setTimeout(()=>{count+=1done()},1000)}).add(done=>{setTimeout(()=>{count+=1done()},1000)})setTimeout(()=>{console.log(count)// 2},1100)
可以透過addFirst
將該排程插入貯列的最優先:
import{pawn}from'pors'letarray=[]asnumber[]pawn(1).add((done)=>{setTimeout(()=>{array.push(1)done()},25)}).add((done)=>{setTimeout(()=>{array.push(2)done()},25)}).addFirst((done)=>{setTimeout(()=>{array.push(3)done()},25)})setTimeout(()=>{console.log(array.join())// 1,3,2},100)
可以透過addAsync
省略done
、error
等callback
:
import{pawn}from'pors'letarray=[]asnumber[]pawn(1).addAsync(async()=>{array.push(1)})
letpawn=pawn(2).add(done=>{setTimeout(()=>{count+=1done()},1000)})console.log(pawn.size)// 1
當系統執行完佇列後觸發
系統監聽一樣可以監聽到該事件。
letpawn=pawn()pawn.on('empty',()=>{console.log('done')})
跟on
不同的地方在於onEmpty
宣告的當下若已經沒有執行續,會觸發一次callback
。
letpawn=pawn()pawn.onEmpty(()=>{console.log('done')})
import{pawn}from'pors'letpw=pawn()pw.on('done',(event)=>{console.log(event)/* { "name": "Pawn", "type": "done", "context": { "id": "f73ac396-7202-461e-8eb2-e16ef273cf27", "thread": [Function] }, "listener": { "id": "442a65ce-1972-4ebf-853b-4188dce42c14", "off": [Function] } } */})pw.add(done=>done())
event
事件呼叫後會回傳一個listener
物件,藉由宣告off
取消監聽:
letlistener=pawn().on('done',(event)=>{})listener.off()
藉由off
與id接口取消event
:
letpw=pawn()letlistener=pw.on('done',(event)=>{})pw.off('done',listener.id)
所有的事件都會觸發系統層監聽的事件:
import{on}from'pors'on('done',()=>{console.log('123')})pawn().add(done=>done())
不論棋子還是塞子都有以下三種事件
每個執行續執行前會觸發該事件。
每個執行續執行前完整結束後會觸發該事件。
每個執行續執行錯誤會觸發該事件。
pawn().add((done,error)=>{error()// 由此觸發})
each
可以一次迭代一個陣列:
pawn().each([1,2,3,4],(value,index,done,error)=>{// do something...})
也可以直接填入數字:
pawn().each(5,(value,index,done,error)=>{console.log(value===index)// true// do something...})
clear
可以清空所有正在等待執行的排程:
pawn().add(d=>d()).clear()
塞子是預先加入執行續,最後再宣告執行:
import{stopper}from'pors'letcount=0stopper(2)// 一次允許的執行量,無填入則不會限制.add(done=>{count+=1done()}).add(done=>{count+=1done()}).start(()=>{console.log(count)// 2})
塞子在宣告error
後會直接中斷所有程序,並將result
傳入callback
:
import{stopper}from'pors'letcount=0stopper(2)// 一次允許的執行量,無填入則不會限制.add((done,error)=>{error('123')}).start((error)=>{console.log(error)// '123'})
可以透過addAsync
省略 done、error 等 callback:
import{stopper}from'pors'letarray=[]asnumber[]stopper(1).addAsync(async()=>{array.push(1)})
系統監聽一樣可以監聽到該事件。
letstep=stopper()step.on('process',({ loaded, totalThread})=>{console.log(`${loaded}/${totalThread}`)})
執行start
後會得到一個process
物件,宣告close
可以中斷執行續:
import{stopper}from'pors'letcount=0stopper(2).add((done,error)=>{error('123')}).start((error)=>{console.log(error)}).close()
一個累積計數等待回呼的工具:
importporsfrom'pors'letpump=pors.pump(()=>console.log('OuO'))pump.add(2)pump.press()pump.press()// 'OuO'