[RxJS] Reactive Programming - Clear data while loading with RxJS startWith()
In currently implemention, there is one problem, when the page load and click refresh button, the user list is not immediatly clean up,it is cleared after the new data come in.
So two things we need to do,
1. Hide User Elements when the user object is null
2. clean the list when page first load
3. clean the list after each refresh click
1. In the renderSuggestion method, check the suggestedUser is null or not, if it is null, then we hide the user item.
function renderSuggestion(suggestedUser, selector) { var suggestionEl = document.querySelector(selector); if (suggestedUser === null) { suggestionEl.style.visibility = 'hidden'; } else { suggestionEl.style.visibility = 'visible'; var usernameEl = suggestionEl.querySelector('.username'); usernameEl.href = suggestedUser.html_url; usernameEl.textContent = suggestedUser.login; var imgEl = suggestionEl.querySelector('img'); imgEl.src = ""; imgEl.src = suggestedUser.avatar_url; } }
2. So when the page load, you can see the frash, because we have placeholder in the html:
<ul class="suggestions"> <li class="suggestion1"> <img /> <a href="#" target="_blank" class="username">this will not be displayed</a> <a href="#" class="close close1">x</a> </li> <li class="suggestion2"> <img /> <a href="#" target="_blank" class="username">neither this</a> <a href="#" class="close close2">x</a> </li> <li class="suggestion3"> <img /> <a href="#" target="_blank" class="username">nor this</a> <a href="#" class="close close3">x</a> </li> </ul>
When the data comes in, it will be replaced with data, it will be obvious when the low speed internet.
SO in the createSuggestion method, we use startWith(null), it set suggestionUser to null:
function createSuggestionStream(responseStream) { return responseStream.map(listUser => listUser[Math.floor(Math.random()*listUser.length)] ) .startWith(null); }
This will solve the problem when first loading, the user list frashing...
3. In each responseStream, we merge with refreshClickStream and return null value. Because network request take time to finish, so the null value will effect the responseStream first, so the user item can be hided.
function createSuggestionStream(responseStream) { return responseStream.map(listUser => listUser[Math.floor(Math.random()*listUser.length)] ) .startWith(null) .merge(refreshClickStream.map(ev => null)); }
//----r---------------------r----------> // startWith(N) //N---r-------------------------------> //------------------N-----N-----------> // merge //N---r-----------------r---r----------> //
--------------------------
var refreshButton = document.querySelector('.refresh'); var refreshClickStream = Rx.Observable.fromEvent(refreshButton, 'click'); var startupRequestStream = Rx.Observable.just('https://api.github.com/users'); var requestOnRefreshStream = refreshClickStream .map(ev => { var randomOffset = Math.floor(Math.random()*500); return 'https://api.github.com/users?since=' + randomOffset; }); var responseStream = startupRequestStream.merge(requestOnRefreshStream) .flatMap(requestUrl => Rx.Observable.fromPromise(jQuery.getJSON(requestUrl)) ); function createSuggestionStream(responseStream) { return responseStream.map(listUser => listUser[Math.floor(Math.random()*listUser.length)] ) .startWith(null) .merge(refreshClickStream.map(ev => null)); } var suggestion1Stream = createSuggestionStream(responseStream); var suggestion2Stream = createSuggestionStream(responseStream); var suggestion3Stream = createSuggestionStream(responseStream); // Rendering --------------------------------------------------- function renderSuggestion(suggestedUser, selector) { var suggestionEl = document.querySelector(selector); if (suggestedUser === null) { suggestionEl.style.visibility = 'hidden'; } else { suggestionEl.style.visibility = 'visible'; var usernameEl = suggestionEl.querySelector('.username'); usernameEl.href = suggestedUser.html_url; usernameEl.textContent = suggestedUser.login; var imgEl = suggestionEl.querySelector('img'); imgEl.src = ""; imgEl.src = suggestedUser.avatar_url; } } suggestion1Stream.subscribe(user => { renderSuggestion(user, '.suggestion1'); }); suggestion2Stream.subscribe(user => { renderSuggestion(user, '.suggestion2'); }); suggestion3Stream.subscribe(user => { renderSuggestion(user, '.suggestion3'); });
<!DOCTYPE html> <html> <head> <script src="https://code.jquery.com/jquery-1.7.2.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.8/rx.all.js"></script> <meta charset="utf-8"> <title>JS Bin</title> </head> <body> <div class="container"> <div class="header"> <h3>Who to follow</h3><a href="#" class="refresh">Refresh</a> </div> <ul class="suggestions"> <li class="suggestion1"> <img /> <a href="#" target="_blank" class="username">this will not be displayed</a> <a href="#" class="close close1">x</a> </li> <li class="suggestion2"> <img /> <a href="#" target="_blank" class="username">neither this</a> <a href="#" class="close close2">x</a> </li> <li class="suggestion3"> <img /> <a href="#" target="_blank" class="username">nor this</a> <a href="#" class="close close3">x</a> </li> </ul> </div> </body> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2015-03-09 [AngularJS] Reusable directive, require from parent controller