动态URL的API调用问题:Observable未定义导致无法订阅
问题分析与修复方案
你的问题出在queryFlights方法的else分支——你没有返回创建好的Observable流!
当应用启动时,this.getFlightsURL还未加载完成,代码进入else分支,你通过this.sls.getServices()构建了一个Observable链,但没有把这个链return出去,导致整个queryFlights函数返回undefined。而undefined自然没有subscribe方法,这就是启动时报错Cannot read property 'subscribe' of undefined的根本原因。
按钮触发时能正常工作,是因为此时this.getFlightsURL已经被加载完成,代码走if分支,正确返回了queryFlightsHelper生成的Observable,所以subscribe能正常执行。
修复代码
只需要在else分支的Observable链前加上return即可:
queryFlights(body: FlightBoardApiCallBody): Observable<any>{ if (this.getFlightsURL){ return this.queryFlightsHelper(body, this.getFlightsURL); } else { // 这里加上return,把Observable返回出去 return this.sls.getServices() .map(s => s[GET_FLIGTHS_SERVICE_NAME]) .switchMap(url => { if (url != null){ // 建议在这里把url缓存到this.getFlightsURL,避免下次重复请求 this.getFlightsURL = url; return this.queryFlightsHelper(body, url); } else { return Observable.empty(); } }); } }
额外优化建议
我还建议你在获取到url后,把它赋值给this.getFlightsURL(像上面代码里注释的那样),这样后续再调用queryFlights时,就可以直接走if分支,不用每次都去请求sls服务获取URL,提升性能。
内容的提问来源于stack exchange,提问作者NDDT
相关产品推荐
相关产品推荐

