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' ] }
Теперь для задачи: если в любой момент, значение, подобное {mergemewith: ['e'], foo1: '7_e'} или {mergemewith: ['f '], foo2:' 42_f '} входит, он должен быть объединен вместе с {ids: [' e ',' f ']} , в результате чего вывод, такой как:
Использование Rxjs, у меня есть код ниже: < /p> [code]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); }
duplicate входящие значения (на основе их идентификаторов < /code> свойство , не относительно порядка) < /li> Держите их на второй < /li> После этого отправьте его подписчику. < /li> < /ul> , который, кажется, работает, и абонент получает как и ожидалось: < /p> { ids: [ 'a', 'b' ] } { ids: [ 'c', 'd' ] } { ids: [ 'e', 'f' ] } { ids: [ 'a', 'b' ] } [/code] Теперь для задачи: если в любой момент, значение, подобное {mergemewith: ['e'], foo1: '7_e'} или {mergemewith: ['f '], foo2:' 42_f '} входит, он должен быть объединен вместе с {ids: [' e ',' f ']} , в результате чего вывод, такой как: [code]{ ids: [ 'a', 'b' ] } { ids: [ 'c', 'd' ] } { ids: [ 'e', 'f' ], mergeMeWith: ['e', 'f'], foo1: '7_e', foo2: '42_f' } { ids: [ 'a', 'b' ] } [/code] Как мне это сделать?