Вызов функции страницы из провайдера в Ionic 2 - PullRequest
0 голосов
/ 21 мая 2018

У меня есть Observable.timer внутри провайдера, который я импортирую на определенную страницу.Как я могу вызвать функцию, когда заканчивается таймер, который находится внутри страницы, а не в провайдере?

То, что я делаю сейчас, пытается вернуть значение, когда таймер заканчивается у провайдера, используя .finally(() => this.endT()), но этоне работает

СТРАНИЦА

  import { TimerProvider } from '../../providers/timer/timer';

  endTimer() {
    console.log('timer ended');
  }

  newTimer() {
    this.countDown = this.timerProvider.newTimer();
    if(this.countDown == 'timer complete'){
      this.endTimer();
    }
  }

ПРОВАЙДЕР

  countDown: any;
  counter = 1*100;
  tick = 1000;

  constructor(public http: HttpClient) {
    //console.log('Hello TimerProvider Provider');
  }

  newTimer() {
     return Observable.timer(0, this.tick).take(this.counter)
     .map(() => --this.counter).finally(() => this.endT());
  }

  endT() {
    return 'timer complete';
  }

Ответы [ 2 ]

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

Одним из способов является использование EventEmitter в провайдере, который выдает что-то, когда заканчивается таймер.И в компоненте, который его использует, вы подписываетесь на него.Это распространенный шаблон при написании приложений на Angular с использованием реактивного шаблона.

//provider
public timerEvent = new EventEmitter();
//...
newTimer() {
  Observable.timer(0, this.tick).take(this.counter)
  .map(() => --this.counter)
  .finally(() => this.timerEvent.emit(null));
}

//component
newTimer() {
  this.timerProvider.timerEvent.subscribe( () => {
    //will be called when the timer from the providers ends
  });
  this.timerProvider.newTimer();
}
0 голосов
/ 21 мая 2018

У меня была эта проблема раньше.Существует простое решение этой проблемы в JavaScript / Typescript: функции обратного вызова

JavaScript позволяет передавать функции другой функции, например:

Ваша страница

myCallback() {
    console.log('finished');
}

myFunction() {
    // i'm calling my other function right here
    anotherFunction(myCallback);
}

Ваш провайдер

anotherFunction(callback) {
    // check if a callback is passed
    if (callback) {
        // execute your callback function whenever you want
        callback();
    }
}

Вы даже можете передать данные в функцию обратного вызова.Вы можете знать это понятие из Promises.

...