{"action":"created","issue":{"url":"https://api.github.com/repos/rethinkdb/horizon/issues/634","repository_url":"https://api.github.com/repos/rethinkdb/horizon","labels_url":"https://api.github.com/repos/rethinkdb/horizon/issues/634/labels{/name}","comments_url":"https://api.github.com/repos/rethinkdb/horizon/issues/634/comments","events_url":"https://api.github.com/repos/rethinkdb/horizon/issues/634/events","html_url":"https://github.com/rethinkdb/horizon/issues/634","id":164224529,"number":634,"title":"Interacting with Horizon's observables is an enormous pain.","user":{"login":"mlucy","id":1777134,"avatar_url":"https://avatars.githubusercontent.com/u/1777134?v=3","gravatar_id":"","url":"https://api.github.com/users/mlucy","html_url":"https://github.com/mlucy","followers_url":"https://api.github.com/users/mlucy/followers","following_url":"https://api.github.com/users/mlucy/following{/other_user}","gists_url":"https://api.github.com/users/mlucy/gists{/gist_id}","starred_url":"https://api.github.com/users/mlucy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mlucy/subscriptions","organizations_url":"https://api.github.com/users/mlucy/orgs","repos_url":"https://api.github.com/users/mlucy/repos","events_url":"https://api.github.com/users/mlucy/events{/privacy}","received_events_url":"https://api.github.com/users/mlucy/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/rethinkdb/horizon/labels/client","name":"client","color":"00d2a5"},{"url":"https://api.github.com/repos/rethinkdb/horizon/labels/User%20friendliness","name":"User friendliness","color":"5DB3C6"}],"state":"open","locked":false,"assignee":{"login":"deontologician","id":1366,"avatar_url":"https://avatars.githubusercontent.com/u/1366?v=3","gravatar_id":"","url":"https://api.github.com/users/deontologician","html_url":"https://github.com/deontologician","followers_url":"https://api.github.com/users/deontologician/followers","following_url":"https://api.github.com/users/deontologician/following{/other_user}","gists_url":"https://api.github.com/users/deontologician/gists{/gist_id}","starred_url":"https://api.github.com/users/deontologician/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deontologician/subscriptions","organizations_url":"https://api.github.com/users/deontologician/orgs","repos_url":"https://api.github.com/users/deontologician/repos","events_url":"https://api.github.com/users/deontologician/events{/privacy}","received_events_url":"https://api.github.com/users/deontologician/received_events","type":"User","site_admin":false},"assignees":[{"login":"deontologician","id":1366,"avatar_url":"https://avatars.githubusercontent.com/u/1366?v=3","gravatar_id":"","url":"https://api.github.com/users/deontologician","html_url":"https://github.com/deontologician","followers_url":"https://api.github.com/users/deontologician/followers","following_url":"https://api.github.com/users/deontologician/following{/other_user}","gists_url":"https://api.github.com/users/deontologician/gists{/gist_id}","starred_url":"https://api.github.com/users/deontologician/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deontologician/subscriptions","organizations_url":"https://api.github.com/users/deontologician/orgs","repos_url":"https://api.github.com/users/deontologician/repos","events_url":"https://api.github.com/users/deontologician/events{/privacy}","received_events_url":"https://api.github.com/users/deontologician/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/rethinkdb/horizon/milestones/7","html_url":"https://github.com/rethinkdb/horizon/milestones/Release%202.0","labels_url":"https://api.github.com/repos/rethinkdb/horizon/milestones/7/labels","id":1775020,"number":7,"title":"Release 2.0","description":"","creator":{"login":"deontologician","id":1366,"avatar_url":"https://avatars.githubusercontent.com/u/1366?v=3","gravatar_id":"","url":"https://api.github.com/users/deontologician","html_url":"https://github.com/deontologician","followers_url":"https://api.github.com/users/deontologician/followers","following_url":"https://api.github.com/users/deontologician/following{/other_user}","gists_url":"https://api.github.com/users/deontologician/gists{/gist_id}","starred_url":"https://api.github.com/users/deontologician/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deontologician/subscriptions","organizations_url":"https://api.github.com/users/deontologician/orgs","repos_url":"https://api.github.com/users/deontologician/repos","events_url":"https://api.github.com/users/deontologician/events{/privacy}","received_events_url":"https://api.github.com/users/deontologician/received_events","type":"User","site_admin":false},"open_issues":16,"closed_issues":9,"state":"open","created_at":"2016-05-18T21:30:33Z","updated_at":"2016-07-11T21:23:27Z","due_on":null,"closed_at":null},"comments":18,"created_at":"2016-07-07T03:54:04Z","updated_at":"2016-07-11T22:06:02Z","closed_at":null,"body":"The single biggest usability problem I've had getting up and running is working with Horizon's observables.  I had three major problems:\r\n\r\n1. It isn't obvious what's defined and what isn't.\r\n  - This was extremely frustrating.  We just link to outside documentation on observables, which is reasonable, but has the unfortunate side-effect that I couldn't actually run most examples because we happened not to include some of the operations.\r\n2. It isn't obvious how to add new operations.\r\n  - We have no documentation on our site about how to do this.\r\n  - I *still* don't know how to do it in the case where you're just writing a script instead of using a build system.\r\n  - It ended up being easier to just download and rebuild Horizon so I could get a client with the commands I needed pre-included.\r\n3. It isn't obvious how to access Horizon's `Observer` class.\r\n  - You need this because some observer commands check that their arguments are from the same class, so you can't e.g. write `hz.currentUser().watch().takeUntil(Rx.Observable.timer(5000))`.\r\n  - I literally ended up writing `Observable = hz.currentUser().watch().constructor` in my code.\r\n\r\nI think we can fix the first one by just providing all of `rx-lite` out of the box.  I think the gains in terms of convenience far outweigh the costs in terms of code size.\r\n\r\n@Tryneus suggested that we could maybe fix (2) and (3) at the same time by letting users pass us the Observable class they want to use, but I don't know if that's reasonable or not.  (We could also just fix (3) by exporting our `Observable` class somewhere and documenting it.)"},"comment":{"url":"https://api.github.com/repos/rethinkdb/horizon/issues/comments/231880239","html_url":"https://github.com/rethinkdb/horizon/issues/634#issuecomment-231880239","issue_url":"https://api.github.com/repos/rethinkdb/horizon/issues/634","id":231880239,"user":{"login":"deontologician","id":1366,"avatar_url":"https://avatars.githubusercontent.com/u/1366?v=3","gravatar_id":"","url":"https://api.github.com/users/deontologician","html_url":"https://github.com/deontologician","followers_url":"https://api.github.com/users/deontologician/followers","following_url":"https://api.github.com/users/deontologician/following{/other_user}","gists_url":"https://api.github.com/users/deontologician/gists{/gist_id}","starred_url":"https://api.github.com/users/deontologician/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deontologician/subscriptions","organizations_url":"https://api.github.com/users/deontologician/orgs","repos_url":"https://api.github.com/users/deontologician/repos","events_url":"https://api.github.com/users/deontologician/events{/privacy}","received_events_url":"https://api.github.com/users/deontologician/received_events","type":"User","site_admin":false},"created_at":"2016-07-11T22:06:02Z","updated_at":"2016-07-11T22:06:02Z","body":"So far we've seen a fair amount of confusion resulting from operators missing. I'd rather not have to second guess which operators we think will be most useful in order to only get a slight benefit in file size. We can include a subset of operators that cover 95% of use cases, but any individual user is likely to need at least one operator outside that set.\r\n\r\nAs it is, if you just need one extra operator and you're not using a bundler, it's a pain to extend Observable. The RxJS UMD is not built with operator patching in mind. The nice modular extensibility designed into the library expects you to be using the import system. I'd like to accommodate our `<script>` tag brothers and sisters without causing them a ton of pain. (If you're using a bundler, then you're ignoring `horizon.*.js`, so how many operators we bundle doesn't matter to you.)\r\n\r\nIf a user is sensitive to size, they can move to Horizon core and hand pick their operators. If you're past the point of prototyping and are looking to streamline your app size, I think that's a reasonable stage to pay the complexity cost of rolling your own Observable.\r\n\r\nAs an aside, if the function bind `::` operator were standards track, I'd say it would be worth it to have a minimal/rx-lite build in addition to kitchen-sink and bring-your-own-Rx builds, since `::` makes it trivial to extend whatever Observable you happen to be presented with. But, unfortunately, it seems `::` is [not picking up steam](https://github.com/zenparsing/es-function-bind/issues/24)."}}
{"actor":{"display_login":"deontologician"}}