为每个带有 Rx 的事件生成带有延迟的第二个后续事件
Generate a second follow up Event with delay for each Event with Rx
目前我正在研究使用反应式框架处理 MIDI 消息。
生成 NoteOn 事件时,它必须跟在 NoteOff 事件之后。那么在每次 NoteOn 之后以一定的延迟发送第二个事件的最佳方法是什么?
类似于:
//pseudo code
var noteOnObservable = GetNoteOns();
var noteOffObservable = noteOnObservable.ForEach(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
NoteOn 和 NoteOff 消息的类型相同 MidiMessage
。
与您所拥有的几乎完全一样。理想情况下,您会发布 noteOnObservable
,这样您就不会有多个订阅:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
你没有描述什么类型 GetDelay
returns。如果它 returns a TimeSpan
,那么您必须将其转换为可观察对象。如果你能在 GetDelay
中工作。如果没有,那么你可以这样做:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => Observable.Timer(GetDelay(e)));
var notes = noteOnObservable.Merge(noteOffObservable);
目前我正在研究使用反应式框架处理 MIDI 消息。
生成 NoteOn 事件时,它必须跟在 NoteOff 事件之后。那么在每次 NoteOn 之后以一定的延迟发送第二个事件的最佳方法是什么?
类似于:
//pseudo code
var noteOnObservable = GetNoteOns();
var noteOffObservable = noteOnObservable.ForEach(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
NoteOn 和 NoteOff 消息的类型相同 MidiMessage
。
与您所拥有的几乎完全一样。理想情况下,您会发布 noteOnObservable
,这样您就不会有多个订阅:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => GetDelay(e));
var notes = noteOnObservable.Merge(noteOffObservable);
你没有描述什么类型 GetDelay
returns。如果它 returns a TimeSpan
,那么您必须将其转换为可观察对象。如果你能在 GetDelay
中工作。如果没有,那么你可以这样做:
var noteOnObservable = GetNoteOns().Publish().RefCount();
var noteOffObservable = noteOnObservable
.Select(e => new NoteOffMessage(e.MidiNote))
.Delay(e => Observable.Timer(GetDelay(e)));
var notes = noteOnObservable.Merge(noteOffObservable);