Загрузка данных с сервера в приложении на nativescript-angular

Я разрабатываю кроссплатформенное приложение с использованием связки NativeScript - Angular, и мне нужно загружать большой объем данных с сервера в фоновом режиме. Прямо сейчас я использую Angular service для загрузки, но когда пользователь закрывает мое приложение и снова открывает его после некоторого периода (подозреваю, что Android выгрузил основную часть приложения из оперативной памяти), запускается новая копия службы, в то время как старая продолжает загрузку, поэтому в приложении есть две службы, каждая из которых загружает данные, к тому же я не имею доступа к старой службе. Как я могу решить эту проблему? Или, если мне нужно запустить для этого фоновую задачу, как я могу это сделать и могу ли я использовать свой службу в этой задаче?

Служба, которую я использую во всем приложении для загрузки данных с сервера:

@Injectable({
    providedIn: "root"
})
export class DataService implements OnDestroy {
    private helper: Helper;

    constructor(private http: HttpClient, translate: TranslateService) {
        this.helper = new Helper(translate);
    }

    downloadData(regionId, languageId: number = 2) {
        return fetch(this.BASE_DOMAIN + "/data/" + regionId + "_" + languageId + ".json")
            .then((response) => response.json())
            .then((responseJson) => {
                this.helper.setOfflineStatus(false);
                if (responseJson.length === undefined
                    || responseJson.length === null
                    || responseJson.length === 0) {
                    responseJson = [];
                }

                return responseJson;
            })
            .catch((error) => {
                console.error(error);
                this.setOffline();
            });
    }

    processItem(regionId, itemObject) {
        const findItem = itemsDb.query({
            select: [],
            where: [{property: "uid", comparison: "equalTo", value: itemObject.uid}]
        });
        if (findItem.length === 0) {
            itemsDb.createDocument(itemObject);
        } else {
            itemsDb.updateDocument(findItem[0].id, itemObject);
        }
        const objectToSearchTitle = {
            uid: itemObject.uid,
            title: itemObject.title.toLowerCase()
        };
        this.helper.addToTitlesArray(regionId, objectToSearchTitle);
    }
}

Собственно, сама служба, которая занимается фоновой загрузкой нужных файлов:

@Injectable({
    providedIn: "root"
})
export class CityDataService implements OnDestroy {

    constructor(private dataService: DataService) {
        console.log("Service starts");
    }

    loadCity(item, languageId: number = 2) {
        setTimeout(() => {
            this.dataService.downloadData(item.uid, languageId).then((items: Array<object>) => {
                if (items !== undefined && items !== null) {
                    const itemsCount = items.length;
                    const imagesLoadedObject = {count: 0};
                    if (items.length > 0) {
                        let itemsCounter = 0;
                        const itemsArray = _.clone(items);
                        const loadInterval = setInterval(() => {
                             // I start loading from my component, then hide app and still see this log, 
                             // but if I open the app again and Android has already removed it from RAM 
                             // (as I think, because sometimes all is ok and new service doesn't start) 
                             // I get new log "Service starts" from constructor and continue getting                                              
                             // logs from here, because old service object is still alive
                             console.log("Loading...");
                             const itemElement = itemsArray.shift();
                             if (itemElement !== undefined && itemElement !== null) {
                                 itemsCounter += 1;
                                 this.dataService.processItem(item.uid, itemElement);
                             } else {
                                 clearInterval(loadInterval);
                                 // some code...
                                 this.loadedData[item.uid] = true;
                             }
                         }, 10);
                    }
                }
            });

            const completeInterval = setInterval(() => {
                if (this.loadedData[item.uid] || false) {
                    clearInterval(completeInterval);
                    // some code...
                }
            }, 500);
       }, 10);
    }
}

Компонент, где запускаю загрузку:

@Component({
    selector: "...",
    templateUrl: "..."
})
export class CityChooseComponent extends CommonComponent implements OnInit {

    constructor(
        private dataService: DataService,
        private cityDataService: CityDataService,
        private routerExtensions: RouterExtensions,
        private _route: ActivatedRoute,
        translate: TranslateService
    ) {
        super(translate);
        this.helper = new Helper(translate);
    }

    loadCity(item) {
         this.cityDataService.loadCity(item, getNumber(Constants.LANGUAGE_ID));
    }
}

Ответы (0 шт):