超时

镜像源 Observable,但在没有发出任何项的情况下,如果经过特定时间段,则发出错误通知

Timeout

如果 Observable 在指定的时间范围内未能发出任何项,则 Timeout 操作符允许你使用 onError 终止来中止 Observable。

另见

特定于语言的信息

待定

待定

RxGroovy 以 timeout 的形式实现此操作符,但以多种变体形式实现。

timeout

第一种变体接受定义时间段的参数(时间量和该时间量表示的 TimeUnit)。每当源 Observable 发出项时,timeout 都会启动一个计时器,如果该计时器在源 Observable 发出另一个项之前超过了持续时间,timeout 将使用错误(TimeoutException)终止其 Observable。

默认情况下,此变体的 timeoutcomputation Scheduler 上运行,但你可以选择不同的 Scheduler,将其作为可选的第三个参数传递给 timeout

timeout

timeout 的第二种变体与第一种不同,它不会在超时条件下发出错误通知,而是立即切换到指定的备用 Observable。

默认情况下,此变体的 timeoutcomputation Scheduler 上运行,但你可以选择不同的 Scheduler,将其作为可选的第三个参数传递给 timeout

timeout

timeout 的第三种变体不使用恒定的超时持续时间,而是通过将源 Observable 中的每个项传递到返回 Observable 的函数中,并监控这些 Observable 来在每项的基础上设置其超时持续时间。如果任何此类 Observable 在源 Observable 发出另一个项之前完成,则认为这是超时条件,并触发 Observable timeout 返回的 onError 通知(“TimeoutException”)。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

还有一种 timeout 变体,它既使用每项 Observable 设置超时持续时间,又会在超时情况下切换到备用 Observable。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

使用每项 Observable 设置超时的 timeout 变体有一个变体,它允许你传递一个函数,该函数返回一个 Observable,该 Observable 充当源 Observable 发出的第一个项的超时计时器(如果没有这个,第一个项就不会超时;也就是说,控制这个第一个超时期的默认 Observable 是 Rx.Observable.never())。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

并且该变体还有一个表兄弟,它会在遇到超时条件时切换到指定的备用 Observable,而不是发出错误。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

RxJava 以 timeout 的形式实现此操作符,但以多种变体形式实现。

timeout

第一种变体接受定义时间段的参数(时间量和该时间量表示的 TimeUnit)。每当源 Observable 发出项时,timeout 都会启动一个计时器,如果该计时器在源 Observable 发出另一个项之前超过了持续时间,timeout 将使用错误(TimeoutException)终止其 Observable。

默认情况下,此变体的 timeoutcomputation Scheduler 上运行,但你可以选择不同的 Scheduler,将其作为可选的第三个参数传递给 timeout

timeout

timeout 的第二种变体与第一种不同,它不会在超时条件下发出错误通知,而是立即切换到指定的备用 Observable。

默认情况下,此变体的 timeoutcomputation Scheduler 上运行,但你可以选择不同的 Scheduler,将其作为可选的第三个参数传递给 timeout

timeout

timeout 的第三种变体不使用恒定的超时持续时间,而是通过将源 Observable 中的每个项传递到返回 Observable 的函数中,并监控这些 Observable 来在每项的基础上设置其超时持续时间。如果任何此类 Observable 在源 Observable 发出另一个项之前完成,则认为这是超时条件,并触发 Observable timeout 返回的 onError 通知(“TimeoutException”)。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

还有一种 timeout 变体,它既使用每项 Observable 设置超时持续时间,又会在超时情况下切换到备用 Observable。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

使用每项 Observable 设置超时的 timeout 变体有一个变体,它允许你传递一个函数,该函数返回一个 Observable,该 Observable 充当源 Observable 发出的第一个项的超时计时器(如果没有这个,第一个项就不会超时;也就是说,控制这个第一个超时期的默认 Observable 是 Rx.Observable.never())。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

timeout

并且该变体还有一个表兄弟,它会在遇到超时条件时切换到指定的备用 Observable,而不是发出错误。

此变体的 timeout 默认情况下在 immediate Scheduler 上运行。

RxJS 以 timeouttimeoutWithSelector 的形式实现此操作符

timeout

timeout 的一种变体接受时间持续时间(以毫秒为单位)。每当源 Observable 发出项时,timeout 都会启动一个计时器,如果该计时器在源 Observable 发出另一个项之前超过了持续时间,timeout 将使用错误(“Timeout” 或您作为可选的第二个参数传递的字符串)终止其 Observable。

示例代码

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 发出另一个项之前完成,则认为这是超时条件,并触发 Observable timeoutWithSelector 返回的 onError 通知(“Error: Timeout”)。

示例代码

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

使用每项 Observable 设置超时的 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

timeouttimeoutWithSelector 位于以下每个发行版中

  • 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 的形式实现此操作符。

如果在指定时间内没有发出任何项,则使 Observable 序列出错。当发生超时时,此操作符使用 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
    

待定