重試後退,直到成功或達到最大嘗試次數

以下程式碼將嘗試執行 loadFromHttp() 最多 5 次(maxAttempts),每次嘗試都會延遲多少秒。如果超過 maxAttempts,Observable 就會放棄。

    // assume loadFromHttp() returns a Promise, which might fail.
    Rx.Observable.from(loadFromHttp())
    .retryWhen((attempts) => {
        let maxAttempts = 5;

        Rx.Observable.range(1, maxAttempts+1).zip(attempts, (i, attempt) => [i, attempt])
        .flatMap(([i, attempt]) => {
            if (i <= maxAttempts) {
                console.log(`Retrying in ${i} second(s)`);
                return Rx.Observable.timer(i * 1000);
            } else {
                throw attempt;
            }
        })
    })