隊列,在數(shù)據(jù)結(jié)構(gòu)中是一種線性表,其特性為必須從一端插入,然后從另一端刪除數(shù)據(jù)。但筆者今天重點不是如何實現(xiàn)該數(shù)據(jù)結(jié)構(gòu),我們可以看一看如何借助隊列管理復(fù)雜的任務(wù)。
隊列在實際開發(fā)中應(yīng)用的場景非常廣泛。因為在一個復(fù)雜的系統(tǒng)中,總是會有一些非常耗時的處理。在這種時候開發(fā)者不能要求系統(tǒng)提供實時處理、實時響應(yīng)的能力。這時候我們就可以通過隊列來解決此類問題。
開發(fā)者可以不停地往隊列塞入數(shù)據(jù),并為其生成唯一值(進(jìn)行跟蹤),同時根據(jù)當(dāng)前系統(tǒng)的處理能力不斷的從隊列取出數(shù)據(jù)進(jìn)行業(yè)務(wù)處理,以此來減輕在同一時間內(nèi)進(jìn)行大量復(fù)雜業(yè)務(wù)處理,以便增強(qiáng)系統(tǒng)的處理能力。
服務(wù)端通??梢越柚犃衼磉M(jìn)行異步處理、系統(tǒng)解耦、數(shù)據(jù)同步以及流量削峰。
使用方法
讓我們開始看一看 better-queue 如何使用。
代碼風(fēng)格
import BetterQueue from "better-queue";
// 創(chuàng)建隊列并且提供任務(wù)處理的回調(diào)函數(shù)
// 當(dāng)調(diào)用回調(diào)意味該數(shù)據(jù)已經(jīng)從隊列中刪除
// 然后從隊列中取出下一條數(shù)據(jù)繼續(xù)處理
const q = new BetterQueue(function (input, cb) {
? // 從隊列中取出數(shù)據(jù)并進(jìn)行處理...
? const result = 'xxxx'
? try {
? ? // 如果成功則調(diào)用回調(diào)并且返回結(jié)果
? ? cb(null, result);
? } catch (err) {
? ? // 否則返回錯誤
? ? cb(err)
? }
})
q.push(1)
q.push({x: 1})
我們可以看到,該庫的代碼風(fēng)格還是采用了 Node 早期版本的回調(diào)風(fēng)格,如果在執(zhí)行期間發(fā)生了錯誤,會把錯誤作為回調(diào)的第一個參數(shù)傳遞到回調(diào)函數(shù)中。類似于:
fs.readFile(filePath, (err, data) => {
? if (err) {
? ? console.log(err)
? ? return
? }
? console.log(data)
})