2016-11-28 6 views
2

У меня есть входной HTML элемент и делает основной вид вперед функция поиска с помощью Наблюдаемые:Как я могу использовать несколько debounceTime для одного наблюдаемого?

Код:

@Output() keywordChange = new EventEmitter(); 

    this.keyword$ = Observable.fromEvent(myInput, 'keyup'); 
    this.keyword$ 
     .map((event: any) => event.target.value) 
     .debounceTime(200) 
     .subscribe(keyword => this.keywordChange.emit(keyword)); 

Поэтому в основном я захватить все ключевые слова, набранные с по меньшей мере 200 мс между каждым KeyUp.

Теперь я хочу сохранить все, что пользователь ищет в файле cookie, чтобы показать им «Ваши последние поисковые запросы», но я хочу подождать 3000 мс до сохранения введенных значений.

Я знаю, что следующий код не будет работать, но только для иллюстрации, я хочу, чтобы достичь чего-то похож на это:

this.keyword$ 
     .map((event: any) => event.target.value) 
     .debounceTime(200) 
     .subscribe(keyword => this.keywordChange.emit(keyword)) 
     .debounceTime(3000) 
     .subscribe(keyword => addKeyWordToLatestSearches(keyword)); 

Возможно ли это каким-то образом, цепочки операторов, чтобы сделать несколько вещей с разными debounceTimes?

ответ

1

Возможно, вы хотите получить share первоначальную подписку, чтобы иметь возможность обрабатывать испускаемые данные двумя независимыми способами? Поскольку вы не хотите подписываться дважды в исходном источнике, вы можете использовать share operator RxJS.

const keyupValue$ = this.keyword$ 
    .map((event: any) => event.target.value) 
    .share(); 

keyupValue$ 
    .debounceTime(200) 
    .subscribe(keyword => this.keywordChange.emit(keyword)) 

keyupValue$ 
    .debounceTime(3000) 
    .subscribe(keyword => addKeyWordToLatestSearches(keyword)); 
+1

Что является следствием не использования доли в этом примере? Я попробовал это, и кажется, что ваш пример работает даже без share(). Разделяет ли это просто так, что мне нужно отслеживать только одну подписку вместо нескольких? – Weblurk

+0

'share()' делает вашу многоадресную рассылку, поэтому обе подписки относятся к одному и тому же источнику. Ваш пример будет работать без 'share()' из-за его простоты. Когда вы начинаете использовать ресурсные тяжелые подписки (вызовы db, http-вызовы и т. Д.), 'Share()' это путь –

+0

Это действительно зависит от вашего наблюдаемого источника. Но, например, при использовании углового API-интерфейса 2 http и без использования этого контента каждый абонент инициирует собственный HTTP-запрос. Таким образом, метод 'share' создает тему, которую вы можете представить как комбинацию абонента и наблюдаемого, которая обрабатывает более одного абонента, повторно используя события исходного потока. –

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