2017-02-14 3 views
0

У меня есть этот кусок кода, который вызывается из компонента:Почему последний вызов выполняется 3 раза?

choose(n?: number): Observable<PickQuality[]> { 
    var chosenObserver: Observer<PickQuality[]>; 
    alert(n); // <-- Notice this line 

    this.getOptions().subscribe(options => { 
      alert(n); // <-- And this one 
      this.reevaluate(); 

      var sorted = options.sort((a, b) => b.score - a.score); 
      var chosen: PickQuality[]; 

      if(n) chosen = sorted.slice(0, n); 
      else chosen = sorted.slice(0, 1); 

      chosenObserver.next(chosen); 
    }); 

    let obs = new Observable<PickQuality[]>(observer => chosenObserver = observer); 
    return obs; 
} 

Вызов следующее:

test.choose().subscribe(a => console.log(a)); 
    test.choose(5).subscribe(b => console.log(b)); 
    test.choose(15).subscribe(c => console.log(c)); 

1-ый вызов, чтобы предупредить печать должным образом («не определено», «5» , «15»), но второй печатает «15» 3 раза. Почему это происходит? Он работал нормально, но некоторые изменения, которые я сделал (и не смог отслеживать), изменили это, и я не могу его исправить.

+0

Hi Luis. Ваш код выглядит свернутым. У вас есть функция, создающая obsA, а затем подписываясь на obsB, чтобы испускать значения на obsA, а затем, наконец, возвращает obsC, который обертывает obsA .... Конечно, это может быть упрощено. Можете ли вы описать ** концептуально **, что должна выполнить ваша функция 'choose()'? – AngularChef

+0

PickQuality имеет объект (полученный по HTTP-запросу GET), связанный с оценкой. Моя функция getOption() извлекает массив из них и выбирает (n?), Как предполагается, возвращать подматрицу n размера, отсортированную по этим баллам. –

ответ

0

Я угадываю здесь, но я думаю, что вы хотите делиться подписками через share().

Когда число наблюдателей, подписавшихся на опубликованные наблюдаемые, идет от 0 до 1, мы подключаемся к лежащей ниже наблюдаемой последовательности.

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

constructor() { 
    this.observable = ....share() 
} 

getOptions() { 
    return this.observable; 
} 
+0

Но у меня есть только один наблюдатель, который является сервисом, который содержит мой код select(). Не следует ли создавать и возвращать скорби, чтобы мой компонент вызывал .subscribe()? –

+0

Да, будет один наблюдаемый, но будет добавлено несколько подписей. Если вы хотите поделиться подпиской (чтобы ее не повторять на подписчика), используйте оператор 'share'. – pixelbits

+0

Я попытался использовать поле Observable в моем классе и сделать 'if (! This.obs) return new Observable (observer => selectedObserver = observer);' 'else return this.obs.share(); 'но, похоже, не работает –

Смежные вопросы