Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generators.observe needs a better way to throw? (And end?) #44

Open
mbostock opened this issue May 13, 2018 · 0 comments

Comments

@mbostock
Copy link
Member

commented May 13, 2018

It’s possible if you notify with a rejected Promise, but this seems a little awkward. For example:

Generators.observe(notify => {
  const socket = new WebSocket("wss://ws.blockchain.info/inv");
  socket.onerror = () => notify(Promise.reject(new Error("socket error")));
  socket.onopen = () => socket.send(JSON.stringify({op: "unconfirmed_sub"}));
  socket.onmessage = event => notify(JSON.parse(event.data));
  return () => socket.close();
})

We could pass two callbacks, resolve and reject, instead (or next and error for symmetry with the Observable proposal; maybe it would be confusing to use the name resolve when it can be called repeatedly)?

Generators.observe((resolve, reject) => {
  const socket = new WebSocket("wss://ws.blockchain.info/inv");
  socket.onerror = () => reject(new Error("socket error"));
  socket.onopen = () => socket.send(JSON.stringify({op: "unconfirmed_sub"}));
  socket.onmessage = event => resolve(JSON.parse(event.data));
  return () => socket.close();
})

But even then we don’t have a way to indicate that the observable stream has ended (without an error). That would correspond to the observer.complete method. If we passed an observer in instead, that would look like:

Generators.observe(observer => {
  const socket = new WebSocket("wss://ws.blockchain.info/inv");
  socket.onerror = () => observer.error(new Error("socket error"));
  socket.onopen = () => socket.send(JSON.stringify({op: "unconfirmed_sub"}));
  socket.onmessage = event => observer.next(JSON.parse(event.data));
  return () => socket.close();
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.