【发布时间】:2018-01-01 18:01:03
【问题描述】:
我刚刚使用 angular/cli 并按照他们的教程创建了一个 Angular 应用程序。然后我决定使用 observables 和一个真正的 rest API 包含 http get 请求,并注意到 angular 总是为空。我尝试了几个公共休息 API(当我将 URL 放在浏览器中时它们确实返回 json 对象)但是当我控制台日志返回的对象总是空的。这是我使用公共 API 的服务的最后一个代码:
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { of } from 'rxjs/observable/of';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { catchError, map, tap } from 'rxjs/operators';
@Injectable()
export class myService {
private apiURL= 'https://jsonplaceholder.typicode.com/users';
constructor(private http: HttpClient) { }
getUsers() {
console.log('calling get!');
this.http.get('https://jsonplaceholder.typicode.com/users').pipe(
tap(users => console.log(users))).subscribe(p => {console.log(p);});
console.log('calling get finish!');
}
}
有什么想法吗?
【问题讨论】:
-
你为什么使用
tap?只需订阅get,无需使用pipe或其他任何东西。this.http.get('...').subscribe(p => { console.log(p) }); -
你怎么打电话给
getUsers()?从技术上讲,这段代码应该可以工作 -
好吧,没关系,
tap是do的别名,所以它不应该和你的 observable 混淆。你能创建一个 plunker 来重现这种行为吗? -
它总是返回 undefined(而不是 null),因为你的方法没有返回任何东西。在
this.http.get(...之前添加return。并删除对 subscribe() 的调用。组件必须订阅,而不是服务。为了能够使用 AJAX 访问外部 API,他们需要启用 CORS。如果没有,您将无法访问它们(无论通过在浏览器位置栏中粘贴 URL 是否有效)。 -
您是否在您的 devtools 网络选项卡中看到正在完成的请求?你是如何调用这个函数的?请添加您的情况的最小示例
标签: angular rest typescript angular-httpclient