Angular http-клиент отменяет предыдущие <get>звонки при тестировании в медленной сети 3G - PullRequest
1 голос
/ 11 января 2020

Итак, я тестирую свое приложение в медленной сети 3G, и я заметил, что Angular HTTP-клиент берет на себя ответственность за отмену предыдущих вызовов, что плохо, поскольку мне нужны все вызовы, отправляемые на сервер (данные и даже заголовок разные, просто URL такой же). Опять же, идентификатор равен diff, поэтому для Angular нет смысла решать, что можно просто отменить предыдущий вызов ... странно!

См. Прикрепленное изображение. Я НЕ пользуюсь switchMap, поэтому предполагается, что все вызовы будут проходить через go даже в медленной сети 3G, но все же Angular HTTP-клиент отменяет предыдущие вызовы.

это мой http-вызов:

const httpOptions2 = {headers: new HttpHeaders({'Content-Type': 'application/json'}), responseType: 'text' as 'json', 'rand': Math.random()};
        const url = `${this.coreAppData[0].webApiResellerBaseUrl}&command=UpdateUserPrivilege&privilegeId=${privilegeId}&accessMask=${accessMask}&customerUserName=${name}&rand=${Math.random()}`;
        return this._http.get<any>(url, httpOptions2).pipe(
            map((result: any) => result)
        );

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

Вот что вы можете увидеть в сетевой консоли.

enter image description here

Как вы заставляете HttpClient отправлять ВСЕ команды на сервер и не отбрасывать предыдущие вызовы ДАЖЕ, если URL-адрес один и тот же (что в моем случае аргументы diff настолько супер странные )

Спасибо,

Шон.

1 Ответ

0 голосов
/ 11 января 2020

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

Я использую здесь Promise, потому что мне нужно, условно, выполнить другую операцию.

  doUploadFiles() {
    let promise = new Promise((resolve, reject) => {
      from(this._files)
        .pipe(
          concatMap((file) => this.fileUpService.pushUpload(file, this.empresa ? this.empresa.cnpj : undefined)),
          finalize( () => {
            this.doProcessaAnalise()
              .subscribe( 
                (result: SimulacaoResult) => {
                  this.simulacaoResult = result
                  resolve(true)
                },
                (error) => reject(error) )
          })
        )
        .subscribe( (result: UploadResult) => {
          if ( ! this.empresa ) {
            this.empresa = result.empresa
          }

          ... do other stuff

          result.duplicatas.forEach( duplicata => this.duplicatas.push(duplicata))
          this.uploads.push(result)
        })
    })

    return promise
  }

Метод pushUpload имеет ничего особенного:

  pushUpload(file, cnpjEmpresa?) {
    let body = new FormData
    body.set('xml', file)
    if ( cnpjEmpresa ) {
      body.set('cnpjEmpresa', cnpjEmpresa);
    }

    return this.httpClient.post(`${this.URL}`, body)
      .pipe(map( result =>  result))

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