Reactive Programming uses the concept of stream to interact with data. Ideally, the stream always returns data and there is no error, then the stream may still exist or complete()
and end. However, if an error occurs, the stream will automatically end, then the user may not be able to interact with the application and must restart all without retry
.
Here are some possible ways to fix this problem.
1. catchError ().
catchError () will be called when the stream has an error and always return a new Observable. The main idea here is that when one stream fails, use another stream.
1 2 3 4 5 6 7 8 |
$stream <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token operator">...</span> <span class="token function">catchError</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token operator">...</span> <span class="token keyword">return</span> newStream$ <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> |
When stream$
error occurs, it will call operator catchError () and return newStream$
. Now stream$
has stopped working and is replaced by newStream$
.
2. onErrorResumeNext ().
Similar to catchError()
, losing one glue shows another, exchanging streams!
1 2 3 4 5 |
<span class="token function">onErrorResumeNext</span> <span class="token punctuation">(</span> failStream$ <span class="token punctuation">,</span> fineStream$ <span class="token punctuation">)</span> |
3. retry () / retryWhen ().
Once failed, sure nothing 2 times 3 did not. Handsome without face, try again and again.
1 2 3 4 5 6 7 8 9 10 |
stream$ <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">retryWhen</span> <span class="token punctuation">(</span> error$ <span class="token operator">=></span> error$ <span class="token punctuation">.</span> <span class="token function">pipe</span> <span class="token punctuation">(</span> <span class="token function">switchMap</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> error <span class="token punctuation">,</span> i <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> i <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">throwError</span> <span class="token punctuation">(</span> error <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">timer</span> <span class="token punctuation">(</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The above are some ways that can be applied when the stream fails. Reference source: