Получить ответ на запрос POST в угловых 6 - PullRequest
0 голосов
/ 29 августа 2018

Я использую angular для создания пользовательского интерфейса, который взаимодействует с API REST. В приведенной ниже функции я сначала добавляю проект по запросу, затем добавляю список псевдонимов, введенных пользователем в форму, затем добавляю псевдоним в проект, затем я получаю список выбранных приложений и ищу их идентификатор, а затем добавить их в проект. Ниже почтовые звонки:

addProject(name: string, description: string): void {

    // Ajouter un nouveau projet
    let newProjectId: number;
    let newAliasId: number;
    let url = this.baseUrl + "/projects";
    this.httpClient.post<Project>(url,
        {'name': name, 'description': description }, 
        httpOptions).subscribe((data: any) => { newProjectId = data['result']['id'];})

    // Ajouter les alias 
    for (let entry of this.aliasList) {
        let UrlAddAlias = this.baseUrl + "/alias";
        this.httpClient.post(UrlAddAlias, {'alias': entry }, httpOptions)
        .subscribe((data: any) => { newAliasId = data['result']['id'];});
        // Ajouter les alias au nouveau projet
        let UrlAliasToProject = this.baseUrl + `/projects/${newProjectId}/alias`;
        this.httpClient.post(UrlAliasToProject, {"alias_id" : newAliasId}, httpOptions)
        .subscribe((data: any) => { console.log("alias added to project");});
    };

    // Ajouter les applications selectionnées au nouveau projet
    for (let entry of this.selectedApps) {
        let Urlapp = this.baseUrl + `/apps/name/${entry}`;
        let appId;
        this.httpClient.get(Urlapp).subscribe(data => { appId = data['result']['id']; });
        let urlappToProject = this.baseUrl + `/projects/${newProjectId}/apps`;
        this.httpClient.post(urlappToProject, {'app_id': appId });
    };
}

Проблема в том, что я не могу получить значение newProjectId и значение newAliasId. Я получаю эту ошибку:

Object { headers: {…}, status: 405, statusText: "Method Not Allowed", url: "http://api.com/v1/projects/undefined/alias", ok: false, name: "HttpErrorResponse", message: "Http failure response for http://api.com/v1/projects/undefined/alias: 405 Method Not Allowed", error: "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>405 Method Not Allowed</title>\n<h1>Method Not Allowed</h1>\n<p>The method is not allowed for the requested URL.</p>\n" }

Я могу получить значения console.log, но они undefined в других местах.

1 Ответ

0 голосов
/ 29 августа 2018

Обратный вызов .subscribe происходит асинхронно. Это означает, что код, который написан после него, все еще будет выполняться перед ним ... похоже на setTimeout

setTimeout(() => console.log('second'));
console.log('first');

По сути, вы можете поместить все после .subscribe внутри .subscribe:

.subscribe((data: any) => {
  newProjectId = data['result']['id'];

  for (let entry of this.aliasList) { ...
});

Возможно, вы также захотите переработать ваш API, если это возможно, чтобы вам не приходилось делать несколько запросов и чтобы post обрабатывал все сам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...