как ждать события подписки до fini sh перед маршрутизацией - PullRequest
0 голосов
/ 09 апреля 2020

В настоящее время я выполняю метод POST и маршрутизирую свое приложение с некоторыми параметрами, но проблема, по-видимому, заключается в том, что приложение маршрутизирует до того, как метод POST будет завершен, и приходит bk с ответом.

моя функция:

    let responseBody;

    let postUploads = function() {
      return this.http.post(url, uploadFile).pipe((response: any) => this.responseBody = response);
    }

    postUploads().subscribe(() => this.router(['/inbox], { queryParams: {file: responseBody} }));

проблема в том, что она идет на маршрут до того, как "responseBody" возвращается в качестве ответа от POST

, как мне заставить его ждать ответа назад, прежде чем я направлю пользователя?

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

У вас есть несколько проблем здесь.

let responseBody;

let postUploads = function() {
  return this.http.post(url, uploadFile).pipe((response: any) => this.responseBody = response);
}

В этом коде, поскольку вы объявляете функцию с использованием синтаксиса function() { }, this будет ссылаться на саму функцию. this.http будет неопределенным.

Кроме того, похоже, что вы пытаетесь установить локальную переменную responseBody с выражением this.responseBody = response.

Это также неправильное использование pipe. Pipe принимает Rx JS операторов, таких как map, tap, et c. Он не принимает обратный вызов, подобный этому.

this.router(['/inbox], { queryParams: {file: responseBody} })

В этом коде вы не правильно вызываете маршрутизатор. Я подозреваю, что вы имеете в виду this.router.navigate(['/inbox], { queryParams: {file: responseBody} });

Фиксированная версия

Ваш код может быть упрощен до следующего:

this.http.post(url, uploadFile).subscribe((response: any) => {
  this.router.navigate(['/inbox'], { queryParams: {file: response } });
});

Это подписывается на наблюдаемое и выполняет навигацию, когда ответ получен. Я не знаю, что такое тип данных response, но если это какой-то блоб, вы, вероятно, не хотите помещать его в URL.

0 голосов
/ 09 апреля 2020

Я думаю, что локальная переменная responseBody здесь не нужна. Вы можете напрямую получить ссылку на responseBody внутри метода подписки. Я удалил ненужный код, пожалуйста, проверьте и дайте мне знать, если он работает.

    let postUploads = function() {
      return this.http.post(url, uploadFile);
    }

    postUploads().subscribe((responseBody) => this.router(['/inbox], { queryParams: {file: responseBody} }));
0 голосов
/ 09 апреля 2020

Вы ссылаетесь на неправильный responseBody.

Попробуйте вместо этого:

  this.http.post(url, uploadFile)
    .subscribe(responseBody => this.router(['/inbox'], { queryParams: { file: responseBody } }))

Идея состоит в том, чтобы вывод наблюдаемой (например, http.post()) проходил через наблюдаемое цепь.

...