1. 程式人生 > >用 Promise 實現一個訊息佇列

用 Promise 實現一個訊息佇列

需求描述

在此篇部落格中,我們的需求如下:

有一個訊息排程器去操作傳送來訊息
但處理訊息花費的事件是不確定的,有多有少
訊息是不斷髮送過來的
這個時候就會出現一種情況:前一條訊息還未執行結束,後一條訊息就被髮送過來了

如果這個時候要求後一條訊息必須在前一條執行完才開始執行,該如何實現?

使用 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');
}

以上即完成了這個功能。