Rx js повторный вызов, пока не будет найдено значение - PullRequest
0 голосов
/ 09 апреля 2020

В angular 8 У меня есть метод, который нужно повторять до тех пор, пока я не получу конкретное сообщение об успехе с сервера.

В моем методе webapi есть вызов, который отправляет эхо-запрос другому серверу и другому серверу. отправляет обратно ключ API. Мне нужно продолжать вызывать этот метод, пока ключ API не будет сгенерирован и, наконец, отправлен обратно. Это необходимо для интервала повторных попыток.

Моя проблема заключается в ответе == успешный вызов никогда не срабатывает.

     return new Promise((resolve, reject) => {
        this.http.get<any>(url)
        pipe(
        map(response => {
          if(response == 'Success'){   <--- Not getting hit.
              resolve(true);
          }
        }),
        timeout(500),           
        retry(),
        delay(1500),
        repeat());
    })

Ответы [ 2 ]

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

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

  1. Не думаю, что вам здесь нужны обещания. Вы можете разрабатывать свой код без них.
  2. Вам необходимо подписаться на свою наблюдаемую, чтобы получать значения из наблюдаемой.
  3. Вам нужно использовать оператор касания вместо оператора карты, так как вам нужно проверить наличие значения

    this.http.get<any>(url)
    pipe(
    tap(response => {
      if(response == 'Success'){   <--- Not getting hit.
        alert('successful data')
      }
    }),
    timeout(500),           
    retry(),
    delay(1500),
    repeat()).subscribe(x => console.log(x));
    })  
    
0 голосов
/ 09 апреля 2020

Если вы оформите заказ здесь , я думаю, вы найдете ответ. Я думаю, что это соответствует вашему вопросу.

return new Promise((resolve, reject) => {
  this.http.get<any>(url).pipe(
    tap(response => {
      if(response == 'Success'){   <--- Not getting hit.
        resolve(true);
      } else {
        // will be catch on retryWhen
        throw 'ERROR';
      }
    }),
    // if any errors, wait 1.5s and try again
    retryWhen(errors => errors.pipe(delayWhen(_ => timer(1500)))
  ).subscribe();
});
...