Reactive Programming sử dụng khái niệm stream để tương tác với data. Trong điều kiện lý tưởng, stream luôn trả lại data và không xảy ra lỗi, khi đó stream có thể vẫn tồn tại hoặc complete()
và kết thúc. Tuy nhiên, nếu xảy ra lỗi thì stream cũng sẽ tự động kết thúc, khi đó user có thể không tương tác gì được với application và phải restart lại toàn bộ nếu không có cơ chế retry
.
Sau đây là một số cách có thể sử dụng để khắc phục vấn đề này.
1. catchError().
catchError() sẽ được gọi khi stream xảy ra lỗi và luôn trả về một Observable mới. Ý tưởng chính ở đây là khi stream này lỗi thì dùng stream khác.
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> |
Khi stream$
xảy ra lỗi, nó sẽ gọi đến operator catchError() và trả lại newStream$
. Lúc này stream$
đã ngừng hoạt động và được thay thế bằng newStream$
.
2. onErrorResumeNext().
Tương tự như catchError()
, thua keo này ta bày keo khác, đổi stream!
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().
Một lần không được, chắc gì lần 2 lần 3 đã không được. Đẹp trai không bằng chai mặt, thử đi thử lại.
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> |
Trên đây là một số cách có thể áp dụng khi stream bị lỗi. Nguồn tham khảo: