import { OnboardingClient } from '../clients/OnboardingClient'; import { OnboardingStatusRequestParams, OnboardingStatusResponse } from '../entities/Onboarding'; export class OnboardingService { constructor(private onboardingClient: OnboardingClient, private $q: QService, private $timeout: TimeoutService) { } pollOnboarding(params: OnboardingStatusRequestParams, minRequestInterval: number = 1000, overallTimeout: number = 10000): Promise { let overallTimeoutPromise = this.$timeout(() => null, overallTimeout); // Recursive function which tries again if onboarding is not ready yet let pollEndpoint: () => Promise = () => { // Catch any HTTP errors so this promise is guaranteed to succeed eventually let onboardingStatus = this.onboardingClient.getOnboardingStatus(params, { timeout: overallTimeout }) .then(success => success.data, error => ({ allAccountsExist: false })); // Wait *at most* for the interval specified - this ensures we don't hit the endpoint too frequently let waitForMinimumInterval = this.$timeout(() => null, minRequestInterval).then(_ => onboardingStatus); // Race this promise against the overall timeout // This would be easier if we had $q.race() but that is only in later Angular versions let deferred = this.$q.defer(); waitForMinimumInterval.then(deferred.resolve); overallTimeoutPromise.then(deferred.reject); return deferred.promise.then(onboardingStatus => onboardingStatus.allAccountsExist ? onboardingStatus : pollEndpoint()); } return pollEndpoint(); } }