用 Promise 实现一个消息队列

版权声明:转载请注明出处! https://blog.csdn.net/zjq_1314520/article/details/83833636

需求描述

在此篇博客中,我们的需求如下:

有一个消息调度器去操作发送来消息
但处理消息花费的事件是不确定的,有多有少
消息是不断发送过来的
这个时候就会出现一种情况:前一条消息还未执行结束,后一条消息就被发送过来了

如果这个时候要求后一条消息必须在前一条执行完才开始执行,该如何实现?

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

以上即完成了这个功能。

阅读更多
换一批

没有更多推荐了,返回首页