<!DOCTYPE html>
<html>

  <head>
    <link rel="stylesheet" href="style.css">
  </head>

  <body>
    <h1>Experiments with RxJS</h1>
    
    <div id="results"></div>

    <script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
    <script src="script.js"></script>
  </body>

</html>
// https://github.com/Reactive-Extensions/RxJS/

// Generic code to display resuts

var results = document.getElementById('results');
function showHTML(html)
{
  results.insertAdjacentHTML('beforeend', html);
}
function show(text)
{
  showHTML("<p>" + text + "<p>");
}
function showObject(obj)
{
  show("<p>" + JSON.stringify(obj) + "<p>");
}

// Make a promise out of a timeout - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
function promiseInTime(timeout, value, willReject)
{
  return new Promise(
    // The resolver function is called with the ability to resolve or reject the promise
    function(resolve, reject) 
    {
      window.setTimeout(
        function afterTimeout() 
        {
          if (willReject)
          {
            // No luck
            reject(value);
          }
          else
          {
            // We fulfill the promise!
            resolve(value);
          }
        }, timeout);
    }
  );
}

// The real code
function test(loadTime)
{
  var prom = promiseInTime(loadTime, { id: 'First'}); // Return data after a while
  var restO = Rx.Observable.fromPromise(prom);
  
  //var load = Rx.Observable.timer(750).do(function () { show('Showing a loading spinner'); });
  var load = Rx.Observable.timer(750);
  var loadD = load.subscribe(
    undefined,
    undefined,
    function onComplete() { show('Showing a loading spinner'); });

  //var o = Rx.Observable.merge(restO, load).switch();
  restO.subscribe(
    function onNext(v) { show('Next - ' + JSON.stringify(v)); },
    function onError(e) { show('Error - ' + JSON.stringify(e)); },
    function onComplete() { show('Done'); loadD.dispose(); }
  );
}

function testRx(loadTime)
{
  var prom = promiseInTime(loadTime, { id: 'First'}); // Return data after a while
  var restService$ = Rx.Observable.fromPromise(prom);
  
  var resolvedProm = promiseInTime(0, null);
  var obs$ = Rx.Observable.fromPromise(resolvedProm)
    .concat(restService$);
  
  var loading$ = Rx.Observable.timer(0, 750)
    .take(2);

  show(`Showing a loading spinner for: ${loadTime}`);
  
  Rx.Observable.combineLatest(obs$, loading$)
    .map(([value, time]) => {
      console.info(value, time);
      if (value === null) {
        console.info('LOADING');
      }
      return value;
    })
    .subscribe(
      function onNext(v) { show('Next - ' + JSON.stringify(v)); },
      function onError(e) { console.error(e); },
      function onComplete() { show('Done'); }
  );
  
  // Rx.Observable.zip(restService$, loading$, (value, time) => value)
  //   .subscribe(
  //     function onNext(v) { show('Next - ' + JSON.stringify(v)); },
  //     function onError(e) { show('Error - ' + JSON.stringify(e)); },
  //     function onComplete() { show('Done'); }
  // );
}

testRx(500);
// testRx(3000);
#dragTarget
{
    background-image: url(https://raw.githubusercontent.com/Reactive-Extensions/RxJS/master/examples/dragndrop/logo.png);
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
    height: 200px;
    width: 200px;
    background-color: #000000;
    border: 1px solid #666666;
    color: #ffffff;
    padding: 10px;
    position: absolute;
    cursor: move;
}
# Experiments with RxJS

Trying Reactive Extensions for JavaScript.

Playground to experiments with some operator combinations / use cases / etc.