Многократная передача данных на сервер в Angular 4 - PullRequest
0 голосов
/ 15 мая 2018

Я создаю какое-то приложение, которое должно быть в состоянии работать в автономном режиме, поэтому, когда он находится в автономном режиме, я кеширую каждую запись данных в локальном хранилище, а когда браузер обнаруживает, что он в сети, я читаю этот кэш и начинаю отправлять все данные в сервер с использованием HttpClient.

Проблема заключается в том, что это подталкивает все данные асинхронно, делая их не всегда выталкивающими в порядке данных от 0 до N, мне интересно, есть ли какой-нибудь алгоритм, который ожидает окончания первого нажатия, прежде чем перейти ко второму? я не хочу использовать setTimeout, так как он медленный, я хочу, чтобы он работал быстро, пока он работает по порядку.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018
this._service.push1(push1data)            
    .subscribe(
        (result) => { this.something = result },
        error => { this.errorMessage = <any>error; },
        () => {
            this._service.push2(push2data)            
                .subscribe(
                    (result) => { this.something2 = result },
                    error => { this.errorMessage = <any>error; },
                    () => {
                        this._service.push3(push3data)            
                            .subscribe(
                                (result) => { this.something3 = result },
                                error => { this.errorMessage = <any>error; },
                                () => {
                                    // and so on
            });
    });
});

Таким образом, только когда первый толчок завершится, начнется второй и т. Д.

0 голосов
/ 15 мая 2018

Я думаю forkJoin - это хорошее решение, которое вы можете использовать здесь.

Вы можете добавить все запросы в массив, как показано ниже

constant allSavedRequests = [];

allSavedRequests.push(this.http.get('https://testdb1.firebaseio.com/.json'));
allSavedRequests.push(this.http.get('https://testdb2.firebaseio.com/.json'));

Теперь с помощью forkJoin вы можете связать все запросы в одну переменную

const runRequests = Observable.forkJoin(allSavedRequests)

Наконец, когда вы находитесь в сети, вам нужно вызвать вызов forkJoin, и он выполнит все запросы за один раз.

runRequests.subscribe(latestValues => {
  console.log( "data_all" , latestValues);
});

Подробнее о forkJoin.

0 голосов
/ 15 мая 2018

Вы ищете flatMap или mergeMap. Это один из самых простых способов заставить REST работать синхронно. Как связать Http-вызовы в Angular2

...