用 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 实现一个消息队列的主要内容,如果未能解决你的问题,请参考以下文章