Rx(Js) for dummies

 

 

Юрий Дадычин

FE DM, Levi9

Во время подготовки я использовал:

И вам рекомендую, серьезно

Но все как-то сложно, почему-бы не примеры?

Асинхронный быт

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
      <script 
        src="https://code.jquery.com/jquery-3.1.0.js"
        ></script>
      <script 
        src="https://unpkg.com/@reactivex/rxjs@5.0.3/dist/global/Rx.js"
        ></script>
  </head>
  <body>
  </body>
</html>
// fromPromise
$(() => {
  Rx.Observable.fromPromise(
    $.get('https://jsonplaceholder.typicode.com/users?q=1')
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});
// empty 
$(() => {
  Rx.Observable.empty()
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=1'))
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});
// concat and reduce
$(() => {
  Rx.Observable.empty()
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=1'))
  )
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=2'))
  )
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=3'))
  )
  .reduce((acc, data) => {
    acc.push(data);
    return acc;
  }, [])
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});
// forkJoin
$(() => {
  Rx.Observable
  .forkJoin(
    $.get('https://jsonplaceholder.typicode.com/users?q=1'),
    $.get('https://jsonplaceholder.typicode.com/users?q=2'),
    $.get('https://jsonplaceholder.typicode.com/users?q=3')
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});
// concatMap
$(() => {
  Rx.Observable
  .forkJoin(
    $.get('https://jsonplaceholder.typicode.com/users?q=1'),
    $.get('https://jsonplaceholder.typicode.com/users?q=2'),
    $.get('https://jsonplaceholder.typicode.com/users?q=3')
  )
  .concatMap(data => {
    console.log('Data from parallel: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/posts?q=4'));
  })
  .concatMap(data => {
    console.log('Data from 1st seq: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=5'));
  })
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});
$(() => {
  const parallel = Rx.Observable.empty()
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=1'))
  )
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=2'))
  )
  .concat(
    Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=3'))
  );

  parallel.subscribe((data) => {
    console.log('One of parallel: ', data);
  });

  const requced = parallel
  .reduce((acc, data) => {
    acc.push(data);
    return acc;
  }, []);

  requced.subscribe((data) => {
    console.log('Reduced: ', data);
  });

  const sequenced = requced
  .concatMap(data => {
    console.log('Data from parallel: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/posts?q=4'));
  })
  .concatMap(data => {
    console.log('Data from 1st seq: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/users?q=5'));
  });

  sequenced.subscribe((data) => {
    console.log('End data: ', data);
  });
});
// catch
$(() => {
  Rx.Observable
  .forkJoin(
    $.get('https://jsonplaceholder.typicode.com/users?q=1'),
    $.get('https://jsonplaceholder.typicode.com/users?q=2'),
    $.get('https://jsonplaceholder.typicode.com/users?q=3')
  )
  .concatMap(data => {
    console.log('Data from parallel: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode.com/posts?q=4'));
  })
  .concatMap(data => {
    console.log('Data from 1st seq: ', data);
    return Rx.Observable.fromPromise(
      $.get('https://jsonplaceholder.typicode1.com/users?q=5'));
  })
  // .catch(err => {
  //   throw 'error in source. Details: ' + err;
  // })
  .catch(err => {
    console.log('Something went wrong: ', err);
    return Rx.Observable.empty();
  })
  .subscribe((data) => {
    console.log('End data: ', data);
  }, () => {}, () =>{
    console.log('We are done');
  });
});

Синтетика

$(() => {
  const subject1 = createTicker('First, Mr.', 1500);
  const subject2 = createTicker('Second, Mr.', 100);
  const subject3 = createTicker('Thisrd, sir', 500);

  subject1.subscribe((item) => {
    console.log(item);
  });

  subject2.subscribe((item) => {
    console.log(item);
  });

  subject3.subscribe((item) => {
    console.log(item);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  subject1.subscribe((item) => {
    console.log(item);
  });

  Rx.Observable
  .forkJoin(
    subject1,
    subject2,
    subject3
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// Hot and Cold
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);

  // COLD
  var observable = Rx.Observable.create(function (observer) {
    observer.next(1);
    observer.next(2);
    observer.next(3);
    observer.complete();
  });

  observable.subscribe((item) => {
    console.log(item);
  });

  subject1.subscribe((item) => {
    console.log(item);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// The Cold
$(() => {
  var observable = Rx.Observable.create(function (observer) {
    observer.next(1);
    observer.next(2);
    observer.next(3);
    observer.complete();
  });

  observable.subscribe((item) => {
    console.log(item);
  });

  setTimeout(() => {
    observable.subscribe((item) => {
      console.log(item);
    });
  }, 2000);
});
// The Hot
$(() => {
  const subject1 = createTicker('First, Mr.',  500);

  subject1.subscribe((item) => {
    console.log(item);
  });

  setTimeout(() => {
    subject1.subscribe((item) => {
      console.log(item);
    });
  }, 2000);
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// take
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  Rx.Observable
  .forkJoin(
    subject1.take(2),
    subject2.take(2),
    subject3.take(2)
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);
  
  return subject;
}
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  Rx.Observable.empty()
  .concat(subject1)
  .concat(subject2)
  .concat(subject3)
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// merge
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  Rx.Observable.empty()
  .merge(
    subject1,
    subject2,
    subject3
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// pairwise
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  Rx.Observable.empty()
  .merge(
    subject1,
    subject2,
    subject3
  )
  .pairwise()
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// scan
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);
  const acc = [];

  Rx.Observable.empty()
  .merge(
    subject1,
    subject2,
    subject3
  )
  .scan((sum, item) => {
    sum.push(item);
    return sum;
  }, acc)
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// from
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);
  const acc = [];

  Rx.Observable.empty()
  .merge(
    subject1,
    subject2,
    subject3
  )
  .scan((sum, item) => {
    sum.push(item);
    return sum;
  }, acc)
  .concatMap(data => {
    return Rx.Observable.from(data);
  })
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}
// zip
$(() => {
  const subject1 = createTicker('First, Mr.',  1500);
  const subject2 = createTicker('Second, Mr.', 2000);
  const subject3 = createTicker('Thisrd, sir', 2500);

  Rx.Observable.zip(
    subject1,
    subject2,
    subject3
  )
  .subscribe((data) => {
    console.log('End data: ', data);
  });
});

function createTicker(name = 'no name', interval = 300) {
  const subject = new Rx.Subject();
  let i = 0;
  setInterval(() => {
    subject.next(`${name} : ${i}`);
    i++;
  }, interval);

  return subject;
}

QnA

deck

By Yuriy Dadichin

deck

  • 710