Timeout (超時)

鏡像來源 Observable,但如果在特定時間段內沒有發出任何項目,則發出錯誤通知

Timeout

Timeout 運算子允許您在 Observable 在指定的時間範圍內未發出任何項目時,使用 onError 終止該 Observable。

另請參閱

特定語言資訊

待定

待定

RxGroovy 將此運算子實作為 timeout,但有幾個變體。

timeout

第一個變體接受定義時間長度的參數(時間量和此時間量所表示的 TimeUnit)。每次來源 Observable 發出一個項目時,timeout 都會啟動一個計時器,如果計時器在來源 Observable 發出另一個項目之前超過該時間長度,timeout 將使用錯誤 (TimeoutException) 終止其 Observable。

預設情況下,此 timeout 變體在 computation Scheduler 上運作,但您可以將其作為 timeout 的可選第三個參數傳遞來選擇不同的 Scheduler

timeout

第二個變體的 timeout 與第一個變體的不同之處在於,如果發生超時條件,它不會發出錯誤通知,而是立即切換到您指定的備份 Observable。

預設情況下,此 timeout 變體在 computation Scheduler 上運作,但您可以將其作為 timeout 的可選第三個參數傳遞來選擇不同的 Scheduler

timeout

第三個變體的 timeout 不使用恆定的超時時間長度,而是透過將來源 Observable 的每個項目傳遞到返回 Observable 的函數,然後監視這些 Observable 來設定每個項目的超時時間長度。如果任何此類 Observable 在來源 Observable 發出另一個項目之前完成,則會將其視為超時條件,並觸發 timeout 返回的 Observable 中的 onError 通知(“TimeoutException”)。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

timeout

還有一個 timeout 變體,它同時使用每個項目的 Observable 來設定超時時間長度,並在發生超時時切換到備份 Observable。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

timeout

使用每個項目的 Observable 設定超時的 timeout 變體有一個變體,允許您傳入一個返回 Observable 的函數,該函數充當來源 Observable 發出的第一個項目的超時計時器(如果沒有此函數,則第一個項目將沒有超時)。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

timeout

並且該變體還有一個同類變體,它將切換到指定的備份 Observable,而不是在達到超時條件時發出錯誤。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

RxJava 將此運算子實作為 timeout,但有幾個變體。

timeout

第一個變體接受定義時間長度的參數(時間量和此時間量所表示的 TimeUnit)。每次來源 Observable 發出一個項目時,timeout 都會啟動一個計時器,如果計時器在來源 Observable 發出另一個項目之前超過該時間長度,timeout 將使用錯誤 (TimeoutException) 終止其 Observable。

預設情況下,此 timeout 變體在 computation Scheduler 上運作,但您可以將其作為 timeout 的可選第三個參數傳遞來選擇不同的 Scheduler

timeout

第二個變體的 timeout 與第一個變體的不同之處在於,如果發生超時條件,它不會發出錯誤通知,而是立即切換到您指定的備份 Observable。

預設情況下,此 timeout 變體在 computation Scheduler 上運作,但您可以將其作為 timeout 的可選第三個參數傳遞來選擇不同的 Scheduler。

timeout

第三個變體的 timeout 不使用恆定的超時時間長度,而是透過將來源 Observable 的每個項目傳遞到返回 Observable 的函數,然後監視這些 Observable 來設定每個項目的超時時間長度。如果任何此類 Observable 在來源 Observable 發出另一個項目之前完成,則會將其視為超時條件,並觸發 timeout 返回的 Observable 中的 onError 通知(“TimeoutException”)。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

timeout

還有一個 timeout 變體,它同時使用每個項目的 Observable 來設定超時時間長度,並在發生超時時切換到備份 Observable。

預設情況下,此 timeout 變體在 immediate Scheduler 上執行。

timeout

使用每個項目的 Observable 設定超時的 timeout 變體有一個變體,允許您傳入一個返回 Observable 的函數,該函數充當來源 Observable 發出的第一個項目的超時計時器(如果沒有此函數,則第一個項目將沒有超時)。

預設情況下,此 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 發出另一個項目之前完成,則會將其視為超時條件,並觸發 timeoutWithSelector 返回的 Observable 中的 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

如果在指定的時間內沒有發出項目,則會使可觀察序列出錯。發生超時時,此運算子會錯誤並顯示 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
    

待定