• [RxJS] Reactive Programming


    So now we want to replace one user when we click the 'x' button. 

    To do that, we want:

    1. Get the cached network data for generating the userList.

    2. Then get a random user from the cached data.

    3. Showing the user in the list.

    We have the function to create suggestion user:

    function createSuggestionStream(responseStream, closeClickStream) {
      return responseStream.map(getRandomUser)
        .startWith(null)
        .merge(refreshClickStream.map(ev => null))
    }

    It contains the 'responseStream' which contains the cached data we need.

    So, the code would somehow like this:

      var close1Clicks = Rx.Observable.fromEvent(closeButton1, 'click');
      close1Clicks.withLatestFrom(responseStream, (clickEv, cachedData) => {
        return getRandomUser(cachedData);
      });

    When the closeClickStream happens, it will fetch the cached data and send userList to getRandomUser() function to pick user.

    Now, we can merge this stream with responseStream:

    function createSuggestionStream(responseStream, closeClickStream) {
      return responseStream.map(getRandomUser)
        .startWith(null)
        .merge(refreshClickStream.map(ev => null))
        .merge(
          closeClickStream.withLatestFrom(responseStream, 
                                      (clickEv, cachedData) => getRandomUser(cachedData))
        );
    }

    -----------

    var refreshButton = document.querySelector('.refresh');
    var closeButton1 = document.querySelector('.close1');
    var closeButton2 = document.querySelector('.close2');
    var closeButton3 = document.querySelector('.close3');
    
    var refreshClickStream = Rx.Observable.fromEvent(refreshButton, 'click');
    var close1Clicks = Rx.Observable.fromEvent(closeButton1, 'click');
    var close2Clicks = Rx.Observable.fromEvent(closeButton2, 'click');
    var close3Clicks = Rx.Observable.fromEvent(closeButton3, '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 requestStream = startupRequestStream.merge(requestOnRefreshStream);
    
    var responseStream = requestStream
      .flatMap(requestUrl =>
        Rx.Observable.fromPromise(jQuery.getJSON(requestUrl))
      )
      .shareReplay(1);
    
    // refreshClickStream: -------f------------->
    // requestStream:      r------r------------->
    // responseStream:     ---R-------R--------->
    // closeClickStream:   ---------------x----->
    // suggestion1Stream:  N--u---N---u---u----->
    
    function getRandomUser(listUsers) {
      return listUsers[Math.floor(Math.random()*listUsers.length)];
    }
    
    function createSuggestionStream(responseStream, closeClickStream) {
      return responseStream.map(getRandomUser)
        .startWith(null)
        .merge(refreshClickStream.map(ev => null))
        .merge(
           closeClickStream.withLatestFrom(responseStream, 
                                      (clickEv, cachedData) => getRandomUser(cachedData))
        );
    }
    
    var suggestion1Stream = createSuggestionStream(responseStream, close1Clicks);
    var suggestion2Stream = createSuggestionStream(responseStream, close2Clicks);
    var suggestion3Stream = createSuggestionStream(responseStream, close3Clicks);
    
    // 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');
    });
  • 相关阅读:
    数据结构第四篇——线性表的链式存储之双向链表
    基本概念之引用赋值需要注意什么?
    基本概念之将引用作为函数的参数有哪些特点?
    基本概念之什么是引用?
    基本概念之模板类有什么优势?
    我的第一篇博文
    为CentOS 6 配置本地YUM源
    为CentOS 6 配置本地YUM源
    poj 1990 MooFest
    [置顶] 学生信息管理系统“重复设置”问题
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5260420.html
Copyright © 2020-2023  润新知