2016-11-23 7 views
7

У меня проблема, когда Angular2 делает тот же запрос дважды. Я не знаю, почему, хотя, потому что у меня есть только один раз подписка на Observable. Вот мой код:Angular2 Получить запрос делается дважды

Моя служба выглядит следующим образом:

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 
     }); 
} 
} 

На вкладке сеть Developer Tools Chrome я вижу запрос сделан два раза, когда инициатором является zone.js, в другой раз он просто говорит «Другое». Может ли кто-нибудь объяснить это поведение?

+0

То, что вы описываете, похоже на предпродажный запрос, сделанный браузером не угловатым. [проверьте этот вопрос] (http://stackoverflow.com/questions/1256593/why-am-i-getting-an-options-request-instead-of-a-get-request). Чтобы проверить, является ли это предпродажным запросом, метод первого запроса будет «ОПЦИИ», второй будет «хорошим» комментарием «GET» – Abdulrahman

+1

- это два запроса GET или запрос OPTIONS, за которым следует запрос GET, если последний, тогда abdul верен, хотя im не уверен, что запросы GET выполняют предполетные запросы?! * – danday74

+0

Это не запрос OPTIONS, это дважды запрос GET. –

ответ

6

Я думаю, что это предполетной запрос. Они сделаны до фактического запроса. Ваш предполетный ответ должен подтвердить эти заголовки, чтобы фактический запрос работал. После того как вы отправите этот ответ на запрос предполетной защиты, браузер выполнит фактический запрос. https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

0

не уверен, не видя все кодовые, но это будет исправить ...

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

вам нужно будет добавить

import 'rxjs/add/operator/first'; 

Первый оператор обеспечение подписывается только вызывается один раз. Однако, если вам нужно, чтобы он вызывался несколько раз (например, позже, когда происходит событие), это не будет вашим решением.

PS subscribe вызывается каждый раз, когда выделяется поток Observable. Если поток излучает дважды, то подписка вызывается дважды. Вы можете отлаживать Наблюдаемые, чтобы увидеть, что она излучает, используя делать()

было бы назвать это дважды, если ...

1 - вы подписались дважды, и он испускает один раз, убедитесь, что вы не призываете подписаться более чем один раз

2 - он излучает в два раза

1

Не видя кода, я могу только догадываться, что ваш компонент открыт маршрутизатором, и вы настроили resolver, который вызывает getProjects(). В этом случае резольвер неявно подписывается на Observable, возвращаемый getProjects(). Следовательно, у вас есть ситуация с двумя вызовами subscribe(): одна явная и одна неявная.

+0

как проверить эту явную и неявную связь, так как я также столкнулся с этой проблемой. – Rohitesh