Saya memiliki satu subjek RXJS yang merupakan aliran WebMidi Notes (catatan adalah array angka), dan subjek lain yang merupakan aliran perangkat output MIDI yang dipilih:

const midiOutputDeviceSubject$ = new Subject<WebMidi.MIDIOutput>();
const midiNoteStream$ = new Subject<number[]>();

Saya ingin mengirim perangkat baru ke midioatarputdevicesSubject $ stream sehingga semua catatan selanjutnya dikirim ke MidinOtestream $ buka perangkat baru itu. Saya mencoba ini:

midiOutputDeviceSubject$.subscribe(outputDevice => {
    midiNoteStream$.subscribe(s => 
        outputDevice.send(s));
    }
});

Ketika ada perangkat baru, itu menambahkan berlangganan baru ke aliran note, tetapi tidak menghapus yang lama. Saya pikir ada solusi sederhana menggunakan SwitchMap, tetapi saya tidak bisa melihatnya.

0
mikebridge 3 अप्रैल 2021, 05:47

1 उत्तर

सबसे बढ़िया उत्तर

Ini (atau sesuatu yang dekat) harus bekerja.

const midiOutputDeviceSubject$ = new Subject<WebMidi.MIDIOutput>();
const midiNoteStream$ = new Subject<number[]>();

midiOutputDeviceSubject$.pipe(
  switchMap(outputDevice => midiNoteStream$.pipe(
    tap(s => outputDevice.send(s))
  ))
).subscribe();

Meskipun solusi yang lebih idiomatis mungkin:

const midiOutputDeviceSubject$ = new Subject<WebMidi.MIDIOutput>();
const midiNoteStream$ = new Subject<number[]>();

midiNoteStream$.pipe(
  withLatestFrom(midiOutputDeviceSubject$)
).subscribe(([s, outputDevice]) => 
  outputDevice.send(s);
);

Karena ini membuat efek samping Anda terkandung dalam subscribe daripada mencemari aliran. Ini juga tidak repot-repot dengan tidak berlangganan dan berlangganan ulang ke aliran yang sama (midiNoteStream$). Itu hanya memelihara kedua langganan ini.

Tapi sungguh, itu yang mana yang lebih mudah dipahami dan dirawat.

3
Mrk Sef 3 अप्रैल 2021, 06:44