Angular2获取请求两次

时间:2016-11-23 17:17:48

标签: angular typescript rxjs subscribe

我有一个问题,Angular2两次发出相同的请求。我不知道为什么,因为我只有一次订阅Observable。这是我的代码:

我的服务如下:

getProjects(): Observable<Project[]> {
    return this.http.get(this.url)
        .map(this.mapProjects)
        .catch(this.handleError);
}

 private mapProjects(response: Response): any {
    const mappedProjects = response.json();
    return mappedProjects;
}

我的组件如下所示:

export class ProjectListComponent implements OnInit {

// List of projects
listProjects: Project[] = [];

constructor(private projectListService: ProjectListService) {
 }

public getProjectList() {
    this.projectListService.getProjects()
        .subscribe(
        projects => {
            this.listProjects = projects;
        },
        error => {
            // error handling
        });
}
}

在Chrome开发者工具的网络标签中,我看到请求是两次,一旦启动器是zone.js,另一次只是说“其他”。任何人都可以解释这种行为吗?

3 个答案:

答案 0 :(得分:8)

我认为这是预检请求。这些是在实际请求之前做出的。您的预检响应需要确认这些标题才能使实际请求生效。一旦您将此响应发送到预检请求,浏览器就会发出实际请求。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

答案 1 :(得分:1)

如果没有看到代码,我只能猜测你的组件是由路由器打开的,并且你已经配置了一个调用getProjects()的解析器。在这种情况下,解析器隐式订阅getProjects()返回的Observable。因此,您有一个有两个subscribe()调用的情况:一个是显式的,一个是隐式的。

答案 2 :(得分:0)

不确定没有看到你的整个代码库,但这将解决它......

.getProjects().first().subscribe(  ... etc

您需要添加

import 'rxjs/add/operator/first';

第一个运算符确保只调用一次订阅。但是,如果您需要多次调用它(例如,稍后发生事件时),那么这将不是您的解决方案。

每次Observable流发出时都会调用PS订阅。如果流发射两次,则订阅被调用两次。您可以使用do()

调试Observable以查看它发出的内容

如果......那就叫它两次。

1 - 您订阅了两次并且它会发出一次,确保您没有多次调用订阅

2 - 它发出两次