【发布时间】:2021-04-21 14:22:44
【问题描述】:
我正在尝试实现一个工单队列系统,默认情况下它将有 3 个不同的队列来持有分别为严重性 1、严重性 2 和严重性 3 的工单。我有一个方法getTicketAtHighestSeverity,它返回最高严重性队列中最旧的票证,所以它从第一个队列开始,查找队列中的第一项,如果当前队列为空,则移动到下一个队列,并且另一种方法getTicketBySeverity 遍历所有队列返回从最高严重性开始的票
这是我的实现。
class ticketQueues {
constructor(numOfQueues = 3) {
this.queues = Array.from({length: numOfQueues}).fill([])
}
addSev1(ticket) {
this.queues[0].push(ticket)
}
addSev2(ticket) {
this.queues[1].push(ticket)
}
addSev3(ticket) {
this.queues[2].push(ticket)
}
*getTicketBySeverity() {
for(const queue of this.queues) {
for(const ticket of queue) {
yield ticket
}
}
return null
}
getTicketAtHighestSeverity() {
for(const queue of this.queues) {
for(const ticket of queue) {
return ticket
}
}
return null
}
}
但是,getTicketBySeverity 似乎无法正常工作。
const queues = new ticketQueues()
queues.addSev1({timestamp: Date(), name: 't1'})
queues.addSev2({timestamp: Date(), name: 't2'})
queues.addSev3({timestamp: Date(), name: 't3'})
for(let i = 2; i >= 0; i--) {
console.log(queues.getTicketBySeverity().next().value) // ???? this keeps returning the first item from the queue
}
因为它不会移动到下一张票,因为它只返回第一张票。我选择 Generator 来实现这种方法的原因是我想利用惰性评估模型,因为数据集可能很大,我不想一次获得所有票。
有人可以用getTicketBySeverity 修复我的实现吗?关于这里的命名有什么建议吗?我觉得这里的命名,即getTicketBySeverity 和getTicketAtHighestSeverity 可能不是最佳选择。此外,如果您认为这可能不是一个合法的用例,请随时评论我对 Generator 的使用。
【问题讨论】:
-
您不断地通过调用
queues.getTicketBySeverity()来创建新的迭代器——每个迭代器都将从第一张票开始。该方法的实现非常好(尽管return null似乎相当不必要)。 -
@Bergi 谢谢这确实是这里发生的事情!
标签: javascript oop ecmascript-6 generator