Получение первых n элементов
извлечь только первые n элементов, испускаемых Observable
Вы можете извлечь только первые n элементов, испускаемых Observable, а затем завершить, игнорируя остальные, изменив Observable с помощью оператора Получение.
См. также
- Первый
- Пропуск
- Пропуск последнего
- Пропуск до
- Пропуск пока
- Получение последнего
- Получение до
- Получение пока
- Введение в Rx: Пропуск и получение
- RxMarbles:
take
Информация, специфичная для языка
RxGroovy limit take
В RxGroovy этот оператор реализован как take.
Если вы используете оператор take(n) (или его синоним, limit(n)) для Observable, и этот Observable испускает меньше, чем n элементов перед завершением, новое, изменённое с помощью take Observable не будет выбрасывать исключение или вызывать onError, а просто испустит это меньшее количество элементов перед завершением.
Пример кода
numbers = Observable.from([1, 2, 3, 4, 5, 6, 7, 8]);
numbers.take(3).subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
);
1 2 3 Sequence complete
Эта разновидность take по умолчанию не работает ни с какой конкретной объектом планирования.
- Javadoc:
take(int)
Существует также разновидность take, которая принимает временную длительность, а не количество элементов. В результате получается Observable, который испускает только те элементы, которые испускаются в течение начального периода существования исходного Observable. Вы устанавливаете эту длительность, передав длительность времени и единицы измерения этой длительности в качестве параметров в take.
Эта разновидность take по умолчанию работает с объектом планирования computation, но вы также можете передать выбранный вами объект планирования в качестве необязательного третьего параметра.
- Javadoc:
take(long,TimeUnit) - Javadoc:
take(long,TimeUnit,Scheduler)
RxJava 1․x limit take
В RxJava этот оператор реализован как take.
Если вы используете оператор take(n) (или его синоним, limit(n)) для Observable, и этот Observable испускает меньше, чем n элементов перед завершением, новое, изменённое с помощью take Observable не будет выбрасывать исключение или вызывать onError, а просто испустит это меньшее количество элементов перед завершением.
Пример кода
Observable.just(1, 2, 3, 4, 5, 6, 7, 8)
.take(4)
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
Next: 1 Next: 2 Next: 3 Next: 4 Sequence complete.
Эта разновидность take по умолчанию не работает ни с какой конкретной объектом планирования.
- Javadoc:
take(int)
Существует также разновидность take, которая принимает временную длительность, а не количество элементов. В результате получается Observable, который испускает только те элементы, которые испускаются в течение начального периода существования исходного Observable. Вы устанавливаете эту длительность, передав длительность времени и единицы измерения этой длительности в качестве параметров в take.
Эта разновидность take по умолчанию работает с объектом планирования computation, но вы также можете передать выбранный вами объект планирования в качестве необязательного третьего параметра.
- Javadoc:
take(long,TimeUnit) - Javadoc:
take(long,TimeUnit,Scheduler)
RxJS take takeUntilWithTime
RxJS реализует оператор take.
Пример кода
var source = Rx.Observable.range(0, 5)
.take(3);
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: 0 Next: 1 Next: 2 Completed
В случае take(0) вы также можете передать в качестве второго параметра объект планирования, который take будет использовать для немедленного планирования вызова onCompleted.
take содержится в каждом из следующих дистрибутивов:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
RxJS также реализует оператор takeUntilWithTime, который похож на take, за исключением того, что вместо конкретного количества элементов, он принимает все элементы, которые испускаются в течение начального периода времени. Вы определяете этот период, передавая параметр в takeUntilWithTime, в любом из этих форматов:
- число
- отражает элементы из исходного Observable до тех пор, пока не пройдёт столько миллисекунд с момента подписки на Observable
Date- отражает элементы из исходного Observable до этой абсолютной точки времени
Вы также можете необязательно передать объект планирования в качестве второго параметра, и таймер будет работать с этим объектом планирования (takeUntilWithTime использует объект планирования timeout по умолчанию).
Пример кода
var source = Rx.Observable.timer(0, 1000)
.takeUntilWithTime(5000);
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); });
Next: 0 Next: 1 Next: 2 Next: 3 Next: 4 Completed
takeUntilWithTime содержится в каждом из следующих дистрибутивов:
rx.all.jsrx.all.compat.js-
rx.time.js(требуетсяrx.jsилиrx.compat.js) rx.lite.jsrx.lite.compat.js
RxPHP take takeUntil
RxPHP реализует этот оператор как take.
Возвращает указанное количество смежных элементов с начала последовательности observable.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/take/take.php
$observable = Rx\Observable::fromArray([21, 42, 63]);
$observable
->take(2)
->subscribe($stdoutObserver);
Next value: 21 Next value: 42 Complete!
RxPHP также имеет оператор takeUntil.
Возвращает значения из исходной observable последовательности до тех пор, пока другая observable последовательность не произведёт значение.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/take/takeUntil.php
$source = \Rx\Observable::interval(105)
->takeUntil(\Rx\Observable::timer(1000));
$subscription = $source->subscribe($stdoutObserver);
Next value: 0 Next value: 1 Next value: 2 Next value: 3 Next value: 4 Next value: 5 Next value: 6 Next value: 7 Next value: 8 Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/take.html