【发布时间】:2016-06-29 00:55:09
【问题描述】:
我有一个可以接收到大量写入的通道。我想等到通道上的大量发送完成后再触发操作。
我看过这个gist,但是,如果缓冲区中有数据,它将每隔interval发送一次输出:
func debounceChannel(interval time.Duration, output chan int) chan int {
input := make(chan int)
go func() {
var buffer int
var ok bool
// We do not start waiting for interval until called at least once
buffer, ok = <-input
// If channel closed exit, we could also close output
if !ok {
return
}
// We start waiting for an interval
for {
select {
case buffer, ok = <-input:
// If channel closed exit, we could also close output
if !ok {
return
}
case <-time.After(interval):
// Interval has passed and we have data, so send it
output <- buffer
// Wait for data again before starting waiting for an interval
buffer, ok = <-input
if !ok {
return
}
// If channel is not closed we have more data and start waiting for interval
}
}
}()
return input
}
在我的情况下,我想等到输入通道上不再有任何数据发送到此突发,然后再触发或发送到输出。
我如何做到这一点?
【问题讨论】:
-
你的意思是把所有数据都输入到输入通道,然后一一读取到输出通道吗?
-
没有。我有一个输入通道,可以突发接收数据。我想从输入中读取数据,并且每次读取大量数据时只写入输出通道一次。
-
您能否扩展评论“等到所有写入完成”?是否打算使用延迟作为信号?
-
@Mark,我更新了我的问题并将其更改为“通道上的突发发送”。我找到了解决问题的方法,并发布了一些实现该问题的代码作为我的答案。
标签: go debouncing