Как создать наблюдаемую с параметрами в Angular 6? - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу создать обсервал, который может передавать некоторые параметры в Angular 6. Ниже приведен пример кода для создания наблюдаемого в Angular site https://angular.io/guide/observables,, но он не объясняет, как передавать какие-либо параметры.

// Create an Observable that will start listening to geolocation updates
// when a consumer subscribes.
const locations = new Observable((observer) => {
  // Get the next and error callbacks. These will be passed in when
  // the consumer subscribes.
  const {next, error} = observer;
  let watchId;

  // Simple geolocation API check provides values to publish
  if ('geolocation' in navigator) {
    watchId = navigator.geolocation.watchPosition(next, error);
  } else {
    error('Geolocation not available');
  }

  // When the consumer unsubscribes, clean up data ready for next subscription.
  return {unsubscribe() { navigator.geolocation.clearWatch(watchId); }};
});

// Call subscribe() to start listening for updates.
const locationsSubscription = locations.subscribe({
  next(position) { console.log('Current Position: ', position); },
  error(msg) { console.log('Error Getting Location: ', msg); }
});

// Stop listening for location after 10 seconds
setTimeout(() => { locationsSubscription.unsubscribe(); }, 10000);

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

const myobservable(a, b) = new Observable((observer) => {
  ...
})

Не могли бы вы сказать, как я могусделай это?

1 Ответ

0 голосов
/ 20 сентября 2018

Невозможно передать параметр в подписку, подписка - это функция обратного вызова, которая будет выполняться при отправке каждого значения в наблюдаемой последовательности.Чтобы понять, как работает наблюдаемый, посмотрите на приведенный ниже пример кода

 var observable = Observable.create(function(observer) {
      var sum = 0;
      for (var i = 1; i <= 4; i++) {
        if (i <= 3) {
          sum = sum + i;
           observer.next(i);  //You can emit each item from the observable also
        }
        if (i === 4) {
          setTimeout(
            i => {
              observer.next(sum);
              observer.complete();
            },
            5000,
            i
          );
        }
      }
    });

. В этом примере кода я запускаю цикл for и генерирую каждое значение, используя наблюдающий.next (значение), когда значениеесли я становлюсь 4, вы можете увидеть, как вы выпустите сумму из 3 чисел и выйдете из всей наблюдаемой последовательности простым вызовом observable.complete ();

Observables являются ленивыми, что означает, что приведенный выше код никогда не выполняется, если выподписываем его.

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

 observable.subscribe({
      next: function(x) {

        console.log("got value " + x);
      },
      error: err => console.error("something wrong occurred: " + err),
      complete: function() {
         //when I become 4 it will complete
        console.log("completed");
      }
    });

В функции обратного вызова next вы получите все значения, которые мы получили из наблюдаемой, включая сумму в качестве конечного значения, а затем она выполнит полный обратный вызовфункция.

Вы можете просто получить каждое значение, как и приведенный ниже синтаксис, что аналогично следующему обратному вызову

  observable.subscribe(function(x) {
      //here you will get all the value including sum
      console.log(x);
    });

Позвольте мне рассказать вам еще один сценарий с тем же примером, просто прокомментировав одну строкукод.Я не испускаю каждое значение, а хочу выпустить сумму только из наблюдаемого и полного.

 var observable = Observable.create(function(observer) {
      var sum = 0;
      for (var i = 1; i <= 4; i++) {
        if (i <= 3) {
          sum = sum + i;
            //commented the code
        }
        if (i === 4) {
          setTimeout(
            i => {
              observer.next(sum);
              observer.complete();
            },
            5000,
            i
          );
        }
      }
    });

Теперь, когда вы подписываетесь, у вас будет только одно значение, то есть сумма

 observable.subscribe(function(x) {
      //here you will get the sum
      console.log(x);
    });

Теперь, возвращаясь к вашему вопросу, для передачи параметра вы можете свернуть все наблюдаемое вк функции, которая возвращает наблюдаемое.Например,

SomeObservableFunction(someparam){
var observable = Observable.create(function(observer) {
       //I am not writing the same code block here 
    });
return observable;
}

Когда вы подписываетесь, вы можете передать значение функции не подписаться и сделать что-то с параметром

SomeObservableFunction(10).subscribe(function(x){

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...