Как исправить угловой пост http, не дожидаясь ответа бэкэнда пирамиды - PullRequest
2 голосов
/ 03 ноября 2019

Я строю angular с помощью ng build --prod.

Вывод в статическую папку в бэкэнде пирамиды

в форме входа, нажимается кнопка, а затем angular делает http сообщениек пирамидеБэкэнд пирамиды получает имя пользователя и pw. генерирует токен jwt и отправляет ответ.

Angular не ожидает ответа.

Angular делает HTTP-пост с использованием подписки и map () без наблюдения.

Создание JWT занимает около 3 секунд. Если я не решу не делать jwt и возвращать json супер быстро из бэкэнда, angular сразу же его поймает.

Если бэкэнд-пирамида не отвечает достаточно быстро, подписанный не поймает данные, илиошибки. кажется, что ничего не выполняется в функциях обратного вызова подписки, потому что это как если бы оно отписалось сразу.

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

Попытка:попытался переключиться в асинхронный режим, та же проблема.
Я исправил угловую маршрутизацию без обработки с помощью outpush хэша true для маршрутизации.

Так выглядит код.

login.component.ts

login_button_pressed(username, password){
  console.log('Seen in console .log');
  this.auth.login(username, password)
  .pipe(first())
  .subscribe( data => {
     //do something with data },
   error => {
     //print error  
  });
   console.log(login function ended);
}


//pseudo code style.

auth.ts

login(username: string, password: string): Observable<user> {
    console.log('This is printed in developer console log');
    return this.http.post<any>('/route', {username, password})
    .pipe(map( returned_data => {

     console.log('this is never executed even though i see backend); 
     console.log('processing the two passed strings')
     //do something with returned data

     return returned_data
  });
}

в бэкэнде пирамиды, я печатаю полученные строки и печатаю на консоли в бэкэнде перед отправкой ответа.

Команды печати, о которых я говорю, существуют для отладки

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете посмотреть mdn асинхронный вызов . Вот следующий фрагмент

Асинхронный запрос

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

Что это означает в вашем случае строка за строкой:

Запись в журнале консоли

login_button_pressed(username, password){
  console.log('Seen in console .log');

Вызывая подписку в наблюдаемой, вы фактически запускаете асинхронный вызов. Это будет отложено, и (data) => // do something with data выполнится, когда придет ответ. Поскольку js на самом деле не является параллельным, это происходило так, что это не делало страницу не отвечающей.

this.auth.login(username, password)
  .pipe(first())
  .subscribe( data => {
    //do something with data },
  error => {
    //print error  
});

Если ответ приходит немедленно, то событие ответа вызывается перед следующей строкой, но это совершенно случайно, и в большинстве производственных случаев с накладными расходами следующий журнал консоли почти всегда будет выполняться первым

   console.log(login function ended);
}

Как решить

Сначала попытайтесь сначала изменить (), чтобы взять (1). first () выдает ошибку, когда поток событий завершает работу перед отправкой одного события, а take (1) - нет.

Во-вторых, вы можете попытаться переключиться на обещание и ожидать

await this.auth.login(username, password)
     .pipe(take().toPromise().then(
         (result) => // Do stuff with result 
     );
...