Код: Выделить всё
const { Subject, groupBy, mergeMap, toArray, timer, map } = require('rxjs');
const waitTime = 1000
const mySource = new Subject();
mySource
.pipe(
groupBy(
(val) => {
return JSON.stringify(val.ids?.sort())
},
null,
() => timer(waitTime)
),
mergeMap(group$ => group$.pipe(
toArray(), // Makes whole thing wait till time is up
map(arr => arr[0]) // Only use first item (they will be equal anyway)
))
)
.subscribe(data => console.log(new Date().toISOString(),"subscriber GOT:",data));
// Code below is just for testing
async function sendToObs(data,delay) {
await new Promise(resolve => setTimeout(resolve,delay))
console.log(new Date().toISOString(), "Sending", data)
mySource.next(data);
}
async function myMain() {
await sendToObs({ ids: ['a','b'] }, 100);
await sendToObs({ ids: ['c','d'] }, 100);
await sendToObs({ ids: ['a','b'] }, 100);
await sendToObs({ ids: ['b','a'] }, 100);
await sendToObs({ ids: ['a','b'] }, 100);
await sendToObs({ ids: ['e','f'] }, 100);
await sendToObs({ ids: ['a','b'] }, waitTime + 500);
}
myMain();
< /code>
Что это должно сделать: < /p>
duplicate входящие значения (на основе их идентификаторов < /code> свойство , не
относительно порядка) < /li>
Держите их на второй < /li>
После этого отправьте его подписчику. < /li>
< /ul>
, который, кажется, работает, и абонент получает как и ожидалось: < /p>
{ ids: [ 'a', 'b' ] }
{ ids: [ 'c', 'd' ] }
{ ids: [ 'e', 'f' ] }
{ ids: [ 'a', 'b' ] }
Код: Выделить всё
{ ids: [ 'a', 'b' ] }
{ ids: [ 'c', 'd' ] }
{ ids: [ 'e', 'f' ], mergeMeWith: ['e', 'f'], foo1: '7_e', foo2: '42_f' }
{ ids: [ 'a', 'b' ] }
Подробнее здесь: https://stackoverflow.com/questions/794 ... ing-values