RxJS повторяет попытку получить данные после входа в систему - если вы вошли в систему, попробуйте один раз

У меня есть следующая проблема, которую я хочу решить с помощью RxJS (Angular 4)

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

У меня есть следующие потоки

const isLoggedIn$ = store.select('currentuser').filter(user => user.id)
const loadActions$ = storeActions$.filter(action => action.type == 'LOAD_DATA_REQUEST')

У меня есть код, но он не соответствует всем вышеперечисленным условиям.

loadActions$.take(1).subscribe(() => { http.get('/api/data') ... })

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


person select    schedule 04.04.2017    source источник


Ответы (1)


Во-первых: вы не должны делать вызов get внутри подписки, при этом вы можете использовать retryWhen для этого:

const isLoggedIn$ = store.select('currentuser').filter(user => user.id)
const loadActions$ = storeActions$.ofType('LOAD_DATA_REQUEST');

loadActions$
    .take(1)  // not sure if you need this, I just copied it from your code
    .switchMap(() => {
        return http.get('/api/data')
            .retryWhen(error => isLoggedIn$.take(1)); // optional: use the "error" parameter to check if the error is 403
    })
person olsn    schedule 04.04.2017