【发布时间】:2019-02-05 17:32:08
【问题描述】:
我有一个 Angular 6 应用程序,我最初用一个 rest api 设置我的后端,但我开始转换部件以使用 socket.io。
当我从我的 rest 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);
}
});
});
使用 mongoose 从我的 mongo 数据库中获取数据:
export function getVersionsByEntity(entityId, callback) {
console.log('models/version - get versions by entity');
Version.find({'entity.entityId': entityId})
.exec(callback);
}
但是,当我使用 socket.io 进行完全相同的调用时,observable 不会返回任何内容。我猜是因为它永远不会完成?数据传输成功后,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;
}
从服务器调用相同的猫鼬函数。
从 (socket) 服务返回的 observable 确实包含数据,只有在我添加 toArray() 函数后,它才会在我订阅时打印任何内容..
有人可以帮我解决这个问题并解释这背后的理论吗?不是完成了吗? http 是否使用 Angular 发送“已完成”消息?
编辑:我创建了一个简单的 stackblitz,它正在做我想做的事,但我想从 _dataService 中删除 take(1),因为我可能想要更新数据,所以我想保持可观察的打开 - @987654321 @
编辑 2:我用扫描运算符替换 toArray 很接近,但它似乎为数组发射了两次。 reduce() 发出正确的数据,但似乎只在完成时发出(如 toArray),所以它没有更好 - https://stackblitz.com/edit/rxjs-toarray-problem-tpeguu
【问题讨论】:
标签: angular group-by rxjs toarray