用 Promise 實現一個訊息佇列
阿新 • • 發佈:2019-02-07
需求描述
在此篇部落格中,我們的需求如下:
有一個訊息排程器去操作傳送來訊息
但處理訊息花費的事件是不確定的,有多有少
訊息是不斷髮送過來的
這個時候就會出現一種情況:前一條訊息還未執行結束,後一條訊息就被髮送過來了
如果這個時候要求後一條訊息必須在前一條執行完才開始執行,該如何實現?
使用 Promise 寫一個 wait 函式
sync function wait(timeout) {
const defer = {
promise : null,
resolve : null,
reject : null,
};
let timer;
defer. promise = new Promise((resolve, reject) => {
defer.resolve = (result) => {
clearTimeout(timer);
resolve(result);
};
defer.reject = (result) => {
clearTimeout(timer);
reject(result);
};
});
timer = setTimeout(defer.resolve, timeout);
return defer.promise;
}
上面的函式主要作用是用來模擬訊息處理的時間。
訊息處理器
async function messagePrint(message) {
await wait(Math.ceil(Math.random() * 10000)); // 隨機設定等待時間
console.warn(message);
}
事件排程器
async function messageSchedule(message) {
promise = promise.then(await messagePrint(message));
}
模擬呼叫事件排程器
async function main () {
await messageSchedule('Message1 Finished');
await messageSchedule('Message2 Finished');
await messageSchedule('Message3 Finished');
await messageSchedule('Message4 Finished');
}
main();
PS: 如果沒有要求後一條訊息必須在前一條執行完才開始執行,則main
程式碼如下
function main() {
messageSchedule('Message1 Finished');
messageSchedule('Message2 Finished');
messageSchedule('Message3 Finished');
messageSchedule('Message4 Finished');
}
以上即完成了這個功能。