【发布时间】:2017-04-20 10:22:42
【问题描述】:
我们想要做的是从一个 url 调用一个端点,该端点返回 2 个变量,这些变量可以在网站的多个部分中使用。虽然我们正在使用 http 调用并订阅它,但为了加快站点速度,我们只想进行一次 api 调用。为了做到这一点,我们在服务上创建了一个 Observable。服务在构造函数中调用一个函数来设置 Observable 的值,但是有时当直接访问一个链接时,会返回一个无法订阅的未定义方法。这是使用 Microsoft ADAL 库的示例代码如下:
首先,我们将变量设置为服务中的 Observable:
@Injectable()
export class MicrosoftGraphService {
public details: Observable<any>;
然后我们在构造函数中设置可观察值:
constructor(
private _http:Http,
private _adalService: AdalService,
private _sanitizer:DomSanitizer
) {
this.getToken().subscribe(token => {
/**
* Get me data from graph to determine school_id and mis_id
*/
this.get('me', token, true).subscribe(me => {
this.details = new Observable(observer => {
observer.next({
me: me
});
observer.complete();
});
});
});
getToken函数为:
getToken(): Observable<any> {
return this._adalService
.acquireToken( this._adalService.config.endpoints.graph );
}
get函数为:
get( endpoint, token, beta = false ): Observable<any> {
return this._http.get( this._adalService.config.endpoints.graph +
this.getVersion( beta ) + endpoint, {
headers: new Headers({ "Authorization": "Bearer " + token })
})
.map(res => {
return res.json();
});
}
然后在组件的构造函数中调用如下:
this._microsoftGraph.details.subscribe(details => {
console.log(details);
});
这应该添加 me 端点返回的控制台日志,但是在某些页面上它确实和其他它返回一个无法订阅未定义的页面。 MicrosoftGraphService 在两个页面的构造函数中被正确调用和设置。
我想知道这是否因为它的调用方式和设置时间而发生,例如访问基本 url 将调用父组件,因为 MicrosoftGraphService 在该构造函数中被调用,它首先被初始化,因此在通过导航访问第二个组件时可用。但是,直接转到子组件的 URL 位置可能意味着它在父组件之前首先被调用,即使两者都加载了 MicrosoftGraphService。
有帮助的路线示例:
const routes: Routes = [
{
path: '',
component: SiteComponent,
canActivate: [LoggedInGuard],
children: [
{ path: 'dashboard', component: DashboardComponent },
{ path: 'tasks', component: TasksComponent },
{
path: '',
redirectTo: '/dashboard'
, pathMatch: 'full'
// , terminal: true
}
]
},
【问题讨论】:
标签: javascript angular rxjs angular2-observables