Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.all.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body ng-app="app">
  <div ng-controller="MyCtrl">
    <h1>{{ timer|async:this }}</h1>
    <h3>Rx repos:</h3>
    <blockquote ng-hide="repos | async">Loading...</blockquote>
    <ul>
      <li ng-repeat="repo in repos|async">
        <a href="{{repo.html_url}}" target="_blank">
          {{ repo.name }}
        </a>
      </li>
    </ul>
    <pre>{{ results | async |json }}</pre>
  </div>
</body>
</html>
 
angular.module('app', [])
.controller('MyCtrl', function($scope, $http){
  $scope.timer = Rx.Observable
    .interval(1000)
    .take(50);
  
  $scope.repos = $http.get('https://api.github.com/orgs/Reactive-Extensions/repos');
})
.filter('async', function() {
  const values = {};
  const subscriptions = {};
  function async(input, scope) {
    // Make sure we have an Observable or a Promise
    if (!input || !(input.subscribe || input.then)) {
      return;
    }
    const inputId = objectId(input);
    if (!(inputId in subscriptions)) {
      const subscriptionStrategy = input.subscribe && input.subscribe.bind(input)
      || input.success && input.success.bind(input) // So it works with HttpPromise
      || input.then.bind(input);
      subscriptions[inputId] = subscriptionStrategy(value => {
        values[inputId] = value;
        if (scope && scope.$applyAsync) {
          scope.$applyAsync();
        }
      });
    }
    return values[inputId] || undefined;
  };
  // Need a way to tell the input objects apart from each other (so we only subscribe to them once)
  let nextObjectID = 0;
  function objectId(obj) {
    if (!obj.hasOwnProperty('__asyncFilterObjectID__')) {
      obj.__asyncFilterObjectID__ = ++nextObjectID;
    }
    return obj.__asyncFilterObjectID__;
  }
  // So that Angular does not cache the return value
  async.$stateful = true;
  return async;
});
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
cvuorinenpro
0viewers