Делайте рекурсивные вызовы, используя http.get() в Angular 2/4

У меня есть сценарий, в котором первоначальный запрос отправит путь URL-адреса, а последующий запрос должен использовать этот путь в качестве URL-адреса, который будет удален с использованием запроса на получение из службы. (Эта часть выполнена)

Теперь начинается реальная проблема. Проблема здесь в том, что второй запрос не будет выдавать выходные данные напрямую, а будет отправлять статус как QUEUE до тех пор, пока ответ полностью обработан. Все, что мне нужно сделать, это подождать/нажать на URL еще раз, пока состояние QUEUE не изменится на состояние OK (фактический ответ приходит сюда).

Код для 2-го запроса:

getOriginalData(url:любой){

  const proxyRequest=this._getRequest(url)

  return proxyRequest
  .expand(response => {
      if (response.uuid==null) {
        this._getRequest(url);
      } else {
        Rx.Observable.empty();
      }
    return Observable.of(response);
  });

private _getRequest(url:any){
  return this._http.get(url)
}

Я следовал этой реализации для достижения своей цели: https://stackoverflow.com/questions/44981974/angular-correctly-using-rxjs-expand-operator-to-make-recursive-http-calls .

Использование этой реализации приводит к

ERROR RangeError: Maximum call stack size exceeded

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


person Am Novice    schedule 15.05.2018    source источник


Ответы (1)


Никогда не использовал оператор расширения, но, насколько я понимаю, вам нужно вернуть Observable.empty, чтобы остановить рекурсивный запрос

person Martin Choraine    schedule 15.05.2018
comment
Но запрос терпит неудачу из-за ошибки стека, хотя - person Am Novice; 15.05.2018
comment
Вы не вернули observable.empty, поэтому расширение не остановилось - person Martin Choraine; 15.05.2018
comment
Я изменил его следующим образом getOriginalData(url:any){ const proxyRequest=this._getRequest(url) return proxyRequest .expand(response => { if (response.uuid==null) { return this._getRequest(url); } else { return Rx.Observable.empty(); } }); Но это продолжается вечно без получения окончательного результата - person Am Novice; 15.05.2018
comment
Поэтому попробуйте отладить, чтобы посмотреть, какой ответ возвращается. Возможно, response.uuid всегда равен нулю, и функция продолжает вызывать http-запрос. - person Martin Choraine; 15.05.2018