通过另一个服务调用 HTTP API
Calling HTTP API via another Service
我正在进行一个服务调用,它通过我的组件在内部调用 http 函数,该组件运行得非常好,我确实得到了响应。但是,当我尝试通过相同的服务和另一种方法进行 http 调用时,它不会得到处理并保持在挂起状态。我试图在上面创建类似的代码。谁能建议可能是什么问题?据我了解,在通过服务中的方法拨打电话时,它没有获得订阅者。但是我无法在下面的代码中找到问题。
补充一下,我看到的行为是 http get 调用不会 return observable 本身,并且在通过相同服务完成调用时不会调用 .map 函数
@Injectable()
export class MyService {
// GET staff by location
getData(): Observable<any> {
// Set content headers
let headers = this.createRequestHeader(localStorage.getString("accessToken"));
// Create a request option
let options = new RequestOptions({ headers: headers });
return this.http.get(url, options)
.map(res => {
return res.json()
})
.catch(this.handleErrors);
}
processQueue(): any {
while (!this.isQueueEmpty()){
this.getData().subscribe((res) => {
this.popQueue();
console.log(res);
});
}}
}
@Component({
selector: "my-component",
moduleId: module.id,
templateUrl: "./my-component.component.html",
styleUrls: ['./my-component.component.css']
})
export class MyComponent implements OnInit, OnDestroy {
ngOnInit(private mySer:MyService): void {
this.mySer.getData().subscribe(
(res) => {
console.log(res);
}
}
如果您正确注入了 connectivy,请尝试直接在 startMonitoring 中调用 getData。
startMonitoring() {
connectivity.startMonitoring((newConnectionType: number) => {
switch (newConnectionType) {
case connectivity.connectionType.none:{
console.log("No Connection!");
break;
}
case connectivity.connectionType.wifi:{
while(!this.isQueueEmpty()){
this.service.getData().subscribe((res)=> {console.log(res);});
}
console.log("Connection type using WiFi.");
break;
}
}
});
或者也许将您的 processQueue 转换为 promise。提示,您的 startMonitoring 可能是一个拦截器 :)
没有特定于服务与组件的问题。然而,问题在于调用 HTTP API 的方式。每次 API 调用后,都会返回 observable,但该方法没有时间执行。只有在执行永远不会执行的订阅方法时才会弹出队列。因此,即使调用是正确的,所有调用都会添加到 PENDING 中。
我正在进行一个服务调用,它通过我的组件在内部调用 http 函数,该组件运行得非常好,我确实得到了响应。但是,当我尝试通过相同的服务和另一种方法进行 http 调用时,它不会得到处理并保持在挂起状态。我试图在上面创建类似的代码。谁能建议可能是什么问题?据我了解,在通过服务中的方法拨打电话时,它没有获得订阅者。但是我无法在下面的代码中找到问题。
补充一下,我看到的行为是 http get 调用不会 return observable 本身,并且在通过相同服务完成调用时不会调用 .map 函数
@Injectable()
export class MyService {
// GET staff by location
getData(): Observable<any> {
// Set content headers
let headers = this.createRequestHeader(localStorage.getString("accessToken"));
// Create a request option
let options = new RequestOptions({ headers: headers });
return this.http.get(url, options)
.map(res => {
return res.json()
})
.catch(this.handleErrors);
}
processQueue(): any {
while (!this.isQueueEmpty()){
this.getData().subscribe((res) => {
this.popQueue();
console.log(res);
});
}}
}
@Component({
selector: "my-component",
moduleId: module.id,
templateUrl: "./my-component.component.html",
styleUrls: ['./my-component.component.css']
})
export class MyComponent implements OnInit, OnDestroy {
ngOnInit(private mySer:MyService): void {
this.mySer.getData().subscribe(
(res) => {
console.log(res);
}
}
如果您正确注入了 connectivy,请尝试直接在 startMonitoring 中调用 getData。
startMonitoring() {
connectivity.startMonitoring((newConnectionType: number) => {
switch (newConnectionType) {
case connectivity.connectionType.none:{
console.log("No Connection!");
break;
}
case connectivity.connectionType.wifi:{
while(!this.isQueueEmpty()){
this.service.getData().subscribe((res)=> {console.log(res);});
}
console.log("Connection type using WiFi.");
break;
}
}
});
或者也许将您的 processQueue 转换为 promise。提示,您的 startMonitoring 可能是一个拦截器 :)
没有特定于服务与组件的问题。然而,问题在于调用 HTTP API 的方式。每次 API 调用后,都会返回 observable,但该方法没有时间执行。只有在执行永远不会执行的订阅方法时才会弹出队列。因此,即使调用是正确的,所有调用都会添加到 PENDING 中。