用 Promise 实现一个消息队列

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 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');

以上即完成了这个功能。

以上是关于用 Promise 实现一个消息队列的主要内容,如果未能解决你的问题,请参考以下文章

Promise实现队列

ES6基础入门教程(十六)promise异步队列

详解如何构建Promise队列实现异步函数顺序执行

用 RabbitMQ 延迟队列,实现消息延迟推送

PHP使用Redis实现消息队列

用消息队列实现即时通讯3