У меня есть приложение angular 6, и я изначально настроил свой бэкэнд с API отдыха, но я начинаю преобразовывать детали для использования socket.io.
Когда я возвращаю данные из моих остальных API, работает следующее:
this.http.get(api_url + '/versions/entity/' + entityId).pipe(
mergeMap((versions:IVersion[]) => versions),
groupBy((version:IVersion) => version.type),
mergeMap(group => group.pipe(
toArray(),
map(versions=> {
return {
type: group.key,
versions: versions
}
}),
toArray()
)),
reduce((acc, v) => acc.concat(v), [])
);
Экспресс-маршрут:
router.get('/entity/:entityId', (req, res) => {
const entityId = req.params.entityId;
Version.getVersionsByEntity(entityId, (err, versions) => {
if (err) {
res.json({success: false, msg: err});
} else {
res.json(versions);
}
});
});
Который получает данные из моей базы данных mongo с помощью mongoose:
export function getVersionsByEntity(entityId, callback) {
console.log('models/version - get versions by entity');
Version.find({'entity.entityId': entityId})
.exec(callback);
}
Однако, когда я делаю точно такой же вызов, но с socket.io, наблюдаемое ничего не возвращает. Я предполагаю, потому что это никогда не завершается? Отправляет ли вызов http сообщение «завершено» при успешной передаче данных?
Розетки отправляются с этого сервиса:
getVersionsByEntity(entityId): Observable<IVersion[]> {
// create observable to list to refreshJobs message
let observable = new Observable(observer => {
this._socketService.socket.on('versionsByEntity', (data) => {
observer.next(data);
});
});
this._socketService.event('versionsByEntity', entityId);
return <Observable<IVersion[]>> observable;
}
Который вызывает ту же функцию мангуста с сервера.
Наблюдаемое, возвращаемое службой (сокетом), на самом деле содержит данные, только когда я добавляю toArray()
функции, она никогда ничего не печатает, когда я подписываюсь ..
Может ли кто-нибудь помочь мне исправить это, а также объяснить теорию, стоящую за этим? Разве это не завершение? Отправляет ли http сообщение «выполнено» с Angular?
РЕДАКТИРОВАТЬ: я создал простой стек стека, который делает то, что я хочу, но я хочу удалить take (1) из _dataService, так как я могу обновлять данные, поэтому я хочу оставить наблюдаемую открытой - https://stackblitz.com/edit/rxjs-toarray-problem
РЕДАКТИРОВАТЬ 2: Я близок, заменив toArray на оператор сканирования, но, похоже, он дважды генерирует массив. Reduce () выдает правильные данные, но, кажется, выдает только при полном (например, toArray), так что не лучше - https://stackblitz.com/edit/rxjs-toarray-problem-tpeguu