функция подписки работает некорректно

в этом фрагменте кода функция подписки выполняется после последней строки в функции loadFromDB:

  loadFromDB(){
    const loading = this.loadingCtrl.create({
      content: 'pleas wait'
    });
    loading.present();
    this.getInterviewFromDB()
      .subscribe((data) => {
        this.events = data;
        console.log( 'before');
      });
    this.getMeetingsFromDB().subscribe((data)=>{
      this.events.concat(data);
    });
    loading.dismiss();

    console.log( 'after');
  }

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

введите здесь описание изображения иллюстрирует эту строку под функцией подписки Execute после console.log внутри нее ... может ли кто-нибудь объяснить мне ..?!


person Tawfiek Khalaf    schedule 23.08.2017    source источник
comment
Это обычная проблема, с которой разработчики сталкиваются при использовании JavaScript. Итак, вы на знакомой территории. Ознакомьтесь с stackoverflow.com/questions/14382567 и stackoverflow.com/questions/2637626   -  person James Lawruk    schedule 24.08.2017


Ответы (2)


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

Observable.forkJoin(this.getInterviewFromDB(), this.getMeetingsFromDB())
    .subscribe(res => {
       let interviews = res[0];
       let meetings = res[1];
    })
person Robin Dijkhof    schedule 23.08.2017
comment
Мистер Робин, спасибо за вашу заботу, но мне все еще непонятно .. не могли бы вы мне объяснить это чуть позже ?! - person Tawfiek Khalaf; 23.08.2017
comment
Это RxJs. Вы можете узнать об этом больше здесь: github.com/Reactive-Extensions/RxJS Помните, что все асинхронный. - person Robin Dijkhof; 23.08.2017

Так работают обратные вызовы. subscribe принимает в качестве аргумента функцию обратного вызова. Я предлагаю вам узнать, что такое обратные вызовы и как они работают, прежде чем продолжить.

Вот немного информации о том, как работает subscribe: функция подписки ReactiveX

Робин предлагает хорошее решение в своем ответе forkJoin. forkJoin объединяет значения, испускаемые несколькими Observable, в массив и создает новый Observable. Затем вы можете подписаться на этот Observable, как это сделал Робин в своем примере, чтобы получить значение массива, которое является первым аргументом обратного вызова.

person Community    schedule 23.08.2017