Spec-Zone.ru › ReactiveX

Таймаут

отображает исходную Observable, но издаёт уведомление об ошибке, если определённый период времени проходит без каких-либо выпущенных элементов
Timeout

Оператор Timeout позволяет вам прервать Observable с onError завершением, если этот Observable не выпустит ни одного элемента в течение заданного промежутка времени.

См. также

  • Debounce
  • Введение в Rx: Таймаут
  • 101 Примеры Rx: Timeout — Простой

Информация, специфичная для языка

RxGroovy timeout

RxGroovy реализует этот оператор как timeout, но в нескольких вариантах.

timeout

Первый вариант принимает параметры, определяющие длительность времени (величина времени и TimeUnit единица измерения этой величины). Каждый раз, когда исходный Observable выпускает элемент, timeout запускает таймер, и если этот таймер превысит длительность до того, как исходный Observable выпустит другой элемент, timeout завершает свой Observable с ошибкой (TimeoutException).

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

  • Javadoc: timeout(long,TimeUnit)
  • Javadoc: timeout()
timeout

Второй вариант timeout отличается от первого тем, что вместо уведомления об ошибке в случае таймаута, он сразу же переключается на резервный Observable, который вы указываете.

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

  • Javadoc: timeout(long,TimeUnit,Observable)
  • Javadoc: timeout(long,TimeUnit,Observable,Scheduler)
timeout

Третий вариант timeout не использует постоянную длительность таймаута, а устанавливает длительность таймаута для каждого элемента, передавая каждый элемент из исходного Observable в функцию, возвращающую Observable, а затем отслеживая эти Observable. Если какой-либо такой Observable завершается до того, как исходный Observable выпустит другой элемент, это считается условием таймаута и запускает уведомление об onError («TimeoutException») от Observable, которое timeout возвращает.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func1)
timeout

Также есть вариант timeout, который использует Observable для каждого элемента для установки длительности таймаута и переключается на резервный Observable в случае таймаута.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func1,Observable)
timeout

У варианта timeout, использующего Observable для каждого элемента для установки таймаута, есть вариант, который позволяет вам передать функцию, которая возвращает Observable, который действует как таймер таймаута для первого элемента, выпущенного исходным Observable (в отсутствие этого, для первого элемента не было бы таймаута).

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func0,Func1)
timeout

И этот вариант также имеет аналог, который переключится на указанный резервный Observable вместо выдачи ошибки при достижении условия таймаута.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func0,Func1,Observable)

RxJava 1․x timeout

RxJava реализует этот оператор как timeout, но в нескольких вариантах.

timeout

Первый вариант принимает параметры, определяющие длительность времени (величина времени и TimeUnit единица измерения этой величины). Каждый раз, когда исходный Observable выпускает элемент, timeout запускает таймер, и если этот таймер превысит длительность до того, как исходный Observable выпустит другой элемент, timeout завершает свой Observable с ошибкой (TimeoutException).

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

  • Javadoc: timeout(long,TimeUnit)
  • Javadoc: timeout()
timeout

Второй вариант timeout отличается от первого тем, что вместо уведомления об ошибке в случае таймаута, он сразу же переключается на резервный Observable, который вы указываете.

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

  • Javadoc: timeout(long,TimeUnit,Observable)
  • Javadoc: timeout(long,TimeUnit,Observable,Scheduler)
timeout

Третий вариант timeout не использует постоянную длительность таймаута, а устанавливает длительность таймаута для каждого элемента, передавая каждый элемент из исходного Observable в функцию, возвращающую Observable, а затем отслеживая эти Observable. Если какой-либо такой Observable завершается до того, как исходный Observable выпустит другой элемент, это считается условием таймаута и запускает уведомление об onError («TimeoutException») от Observable, которое timeout возвращает.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func1)
timeout

Также есть вариант timeout, который использует Observable для каждого элемента для установки длительности таймаута и переключается на резервный Observable в случае таймаута.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func1,Observable)
timeout

У варианта timeout, использующего Observable для каждого элемента для установки таймаута, есть вариант, который позволяет вам передать функцию, которая возвращает Observable, который действует как таймер таймаута для первого элемента, выпущенного исходным Observable (в отсутствие этого, для первого элемента не было бы таймаута).

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func0,Func1)
timeout

И этот вариант также имеет аналог, который переключится на указанный резервный Observable вместо выдачи ошибки при достижении условия таймаута.

Этот вариант timeout по умолчанию выполняется на immediate Планировщике.

  • Javadoc: timeout(Func0,Func1,Observable)

RxJS timeout timeoutWithSelector

RxJS реализует этот оператор как timeout и timeoutWithSelector:

timeout

Один из вариантов timeout принимает длительность времени (в миллисекундах). Каждый раз, когда исходное Observable испускает элемент, timeout запускает таймер, и если этот таймер превышает заданную длительность до того, как исходное Observable испустит другой элемент, timeout завершает своё Observable с ошибкой (“Timeout” или строкой по вашему выбору, которую вы передаёте в качестве необязательного второго параметра).

Пример кода

var source = Rx.Observable
    .return(42)
    .delay(5000)
    .timeout(200, 'Timeout has occurred.');

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Error: Timeout has occurred.
timeout

Другой вариант позволяет указать timeout переключиться на резервное Observable, которое вы указываете, вместо завершения с ошибкой, если условие таймаута срабатывает. Для использования этого варианта передайте резервное Observable (или Promise) в качестве второго параметра к timeout.

Пример кода

var source = Rx.Observable
  .return(42)
  .delay(5000)
  .timeout(200, Promise.resolve(42));

var subscription = source.subscribe(
  function (x) { console.log('Next: %s', x); },
  function (err) { console.log('Error: %s', err); },
  function () { console.log('Completed'); });
Next: 42
Completed
timeoutWithSelector

timeoutWithSelector не использует постоянную длительность таймаута, а устанавливает длительность таймаута для каждого элемента, передавая каждый элемент из исходного Observable в функцию, возвращающую Observable, а затем отслеживая эти Observable. Если какое-либо из таких Observable завершается до того, как исходное Observable испускает другой элемент, это считается условием таймаута и запускает уведомление об ошибке (“Error: Timeout”) от Observable, которое возвращает timeoutWithSelector.

Пример кода

var array = [
    200,
    300,
    350,
    400
];

var source = Rx.Observable
    .for(array, function (x) {
        return Rx.Observable.timer(x);
    })
    .map(function (x, i) { return i; })
    .timeoutWithSelector(function (x) {
        return Rx.Observable.timer(400);
    });

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
Error: Error: Timeout
timeoutWithSelector

Существует также вариант timeoutWithSelector, который одновременно использует Observable для каждого элемента для установки длительности таймаута и переключается на резервное Observable в случае таймаута.

Пример кода

var array = [
    200,
    300,
    350,
    400
];

var source = Rx.Observable
    .for(array, function (x) {
        return Rx.Observable.timer(x);
    })
    .map(function (x, i) { return i; })
    .timeoutWithSelector(function (x) {
        return Rx.Observable.timer(400);
    }, Rx.Observable.return(42));

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: 42
Completed
timeoutWithSelector

Вариант timeoutWithSelector, использующий Observable для каждого элемента для установки таймаута, имеет вариант, который позволяет вам передать Observable, действующее как таймер таймаута для первого элемента, испускаемого исходным Observable (в отсутствие этого не будет таймаута для первого элемента; другими словами, по умолчанию Observable, управляющее этим первым периодом таймаута, это Rx.Observable.never()).

Пример кода

var array = [
    200,
    300,
    350,
    400
];

var source = Rx.Observable
    .for(array, function (x) {
        return Rx.Observable.timer(x);
    })
    .map(function (x, i) { return i; })
    .timeoutWithSelector(Rx.Observable.timer(250), function (x) {
        return Rx.Observable.timer(400);
    });

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
Error: Error: Timeout
timeoutWithSelector

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

Пример кода

var array = [
    200,
    300,
    350,
    400
];

var source = Rx.Observable
    .for(array, function (x) {
        return Rx.Observable.timer(x);
    })
    .map(function (x, i) { return i; })
    .timeoutWithSelector(Rx.Observable.timer(250), function (x) {
        return Rx.Observable.timer(400);
    }, Rx.Observable.return(42));

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: 42
Completed

timeout и timeoutWithSelector находятся в каждой из следующих дистрибуций:

  • rx.all.js
  • rx.all.compat.js
  • rx.time.js
  • rx.lite.js
  • rx.lite.compat.js

Они требуют одну из следующих дистрибуций:

  • rx.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

RxPHP timeout

RxPHP реализует этот оператор как timeout.

Возвращает ошибку в потоке, если за указанное время не испущен ни один элемент. При таймауте этот оператор возвращает ошибку с экземпляром Rx\Exception\TimeoutException

Пример кода

//from https://github.com/ReactiveX/RxPHP/blob/master/demo/timeout/timeout.php

Rx\Observable::interval(1000)
    ->timeout(500)
    ->subscribe($createStdoutObserver('One second - '));

Rx\Observable::interval(100)
    ->take(3)
    ->timeout(500)
    ->subscribe($createStdoutObserver('100 ms     - '));
100 ms     - Next value: 0
100 ms     - Next value: 1
100 ms     - Next value: 2
100 ms     - Complete!
One second - Exception: timeout

© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/timeout.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API