【发布时间】:2017-06-29 14:37:21
【问题描述】:
所以我对 Angular 和一般的 observables 都很陌生。我知道如何处理 Promise,但我希望更适应 Observable 方面。
我会尽量保持简短,但设置如下:
为了减少对服务器的调用量,我创建了一个包服务,它基本上将多个请求打包成一个请求。
如果缓存不是最新的,组件会要求多个数据服务刷新其存储。每个需要从服务器更新的数据服务都会向包中添加一个请求。准备好后,组件将包发送到包服务,包服务反过来将请求发送到服务器。
当服务器回复数据时,我需要每个数据服务使用与其单个请求相关的新数据更新其存储,然后通知组件一切都已完成。
这就是我如何使用 promises 来做的:
1) 组件从每个需要的数据服务构建一个包。
2) 组件将其发送到返回承诺的包服务。
3) 包服务发送请求。
4) 当服务器回复时,包服务将响应分派给包中注册的每个数据服务。
5) 包服务只有在每个涉及的数据服务完成更新其存储时才履行其承诺。
6) 组件处理已解决/已拒绝的承诺。
所以尝试将其转换为可观察的模式,我得到了:
组件:
let thePackage = this.packageService.createPackageInstance();
this.service1.loadData( thePackage );
this.service2.loadData( thePackage );
this.packageService.sendPackage( thePackage ).subscribe( () => console.log("Success"), (err) => console.error( err ) );
Service1 和 Service2:
loadData( thePackage: Package ) {
let needUpdate = this.GetCacheIsUpToDate();
if( needUpdate ) {
let params = {
"param1": true
};
//This would return a promise in a promise chain pattern.
let callback = ( ( response:any ) => {
//[...]
//Do update the data store and notify subscribers.
return Promise.resolve(); //The only way I know to make it work.
});
this.packageService.createRequest( thePackage, 100, 1, params, callback );
}
}
包服务:
createPackageInstance(): Package {
return new Package({/* Some params */});
}
createRequest( thePackage:Package, theModule:number, operation:number, params:any, callback:Function ):void {
let data = JSON.stringify( params );
let request = new Request({
"id": Utils.generateGUID(),
"theModule": theModule,
"operation": operation,
"data" : data,
"callback": callback
});
thePackage.requests.push( request );
}
sendPackage( thePackage ): Observable<PackageResponse>{
//Assume some variables like 'someUrl' to be setup
//[...]
let httpObs = this.http.post( someUrl, formData, someOptions ).map( response => {
return response.json();
});
return httpObs.flatMap( ( response ) => {
let pAll = [];
thePackage.requests.forEach( request => {
pAll.push( request.callback( response ) );
});
return Observable.fromPromise( Promise.all( pAll ) ); //This is really ugly
});
}
编辑:编辑了一些代码以显示我当前的适用于 Promise 的版本。
【问题讨论】:
-
你的代码的结果是什么?你的问题是什么?它在工作吗?如果没有,您是否有任何提示在哪里/为什么失败? -- 编辑:好的,抱歉,我还没有阅读里面的代码......
标签: angular http rxjs observable