RxJS5の監視可能なストリームを希望どおりに動作させることに問題があります。
ストリームはaxiosを使用してHTTPリクエストをWebサイトに送信することになっています。応答がHTTPエラー(axiosはJavaScriptエラーを強制します)の場合、監視可能なシーケンスは10ミリ秒待機してから、リクエストの再送信を試行する必要があります(何らかの理由で)リクエストの送信先のWebサイトは、リクエストの送信をすぐに再試行してエラーをスローし続けると気に入らないが、ほとんどの場合、10ミリ秒の遅延で正常に動作します)。
Rx.Observable
.fromPromise(axios('http://example.com/12345'))
.map(x => new Promise((resolve, reject) => {
setTimeout(() => {
resolve(x)
}, 2000)
}))
.debounceTime(2000)
.do(console.log)
.retry(10)
.subscribe(console.log, console.error)
ストリームがどのように機能するかをより明確にするために、Codepenにいくつかの変更を加えた例があります:http://codepen.io/leakyabstractions/pen/pNmvyZ?editors = 0010
私が使用してみました.delay()
、.debounceTime()
、.timer()
、.timeInterval()
と.timeout()
の代わりに、.map()
オペレータが、何も(含めない.map()
)動作します。私は何が間違っているのですか?
それで、基本的にあなたが探しているのは「10ms後に再試行しますが、10回だけです」ですか?(これはあなたがretry(10)
提案するものです。私は洗練された解決策がretryWhen
ここに含まれると思います:
const mockedRestError$ = Rx.Observable.throw("http://example.com/12345");
// we'll start with an empty string, because otherwhise
// we could not log the "start..."
Rx.Observable.of("")
.do(() => console.log("start..."))
.switchMapTo(mockedRestError$)
.retryWhen(tenTimesWithDelay)
.subscribe(console.log, console.error, console.info); // is never called, because
function tenTimesWithDelay(errors) {
return errors
.scan((count, err) => {
++count;
// optionally to throw the error all the way down to the subscription
// comment the throw out to have the stream simply complete
if (count >= 10) {
throw err;
}
return count;
}, 0)
.takeWhile(count => count < 10)
.do(count => console.log(`Retry #${count} in 100ms...`))
.delay(100);
}
コードペンは次のとおりです:http://codepen.io/anon/pen/bBydwZ?editors = 0010
また、コンソールに少しすっきりと表示されるように、遅延を10ミリ秒ではなく100ミリ秒に設定したことにも注意してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加