From a2bc840292417df7f00cd390585bfa37540000a0 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Mon, 9 Dec 2013 18:34:10 +0100 Subject: [PATCH] Use more fetch instead of find fetch method returns a promise instead of an actual object. We used find before, because this was the way we did things before upgrade to Ember Model. Returning a promise from a model hook pauses router rendering for the time a resource is loading, which makes it much easier to deal with asynchronous requests. Thanks to that we can remove parts of the code, which dealt with it manually. --- assets/scripts/app/models/repo.coffee | 7 ++++ assets/scripts/app/models/user.coffee | 7 ++-- assets/scripts/app/routes.coffee | 48 ++++++++------------------- assets/scripts/lib/travis/ajax.coffee | 2 +- 4 files changed, 27 insertions(+), 37 deletions(-) diff --git a/assets/scripts/app/models/repo.coffee b/assets/scripts/app/models/repo.coffee index 790b3f67..f582fb10 100644 --- a/assets/scripts/app/models/repo.coffee +++ b/assets/scripts/app/models/repo.coffee @@ -135,5 +135,12 @@ require 'travis/model' repo = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug) if repo.length > 0 then repo else @find(slug: slug) + fetchBySlug: (slug) -> + repos = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug) + if repos.length > 0 + repos[0] + else + @fetch(slug: slug).then (repos) -> Ember.get(repos, 'firstObject') + # buildURL: (slug) -> # if slug then slug else 'repos' diff --git a/assets/scripts/app/models/user.coffee b/assets/scripts/app/models/user.coffee index 75122458..553b26bc 100644 --- a/assets/scripts/app/models/user.coffee +++ b/assets/scripts/app/models/user.coffee @@ -58,7 +58,7 @@ require 'travis/model' @get('_rawPermissions').then (data) => permissions.set('content', data.push) permissions ).property() - + updateLocale: (locale) -> @save() Travis.setLocale(locale) @@ -77,7 +77,10 @@ require 'travis/model' poll: -> Travis.ajax.get '/users', (data) => if data.user.is_syncing - Ember.run.later(this, this.poll.bind(this), 3000) + self = this + setTimeout -> + self.poll() + , 3000 else @set('isSyncing', false) @setWithSession('syncedAt', data.user.synced_at) diff --git a/assets/scripts/app/routes.coffee b/assets/scripts/app/routes.coffee index 2fc97286..4641ce49 100644 --- a/assets/scripts/app/routes.coffee +++ b/assets/scripts/app/routes.coffee @@ -218,7 +218,7 @@ Travis.BuildRoute = Ember.Route.extend repo.set('build', model) model: (params) -> - Travis.Build.find(params.build_id) + Travis.Build.fetch(params.build_id) Travis.JobRoute = Ember.Route.extend renderTemplate: -> @@ -236,19 +236,12 @@ Travis.JobRoute = Ember.Route.extend repo.set('job', model) repo.activate('job') - # since we're no longer using promises, the setupController resolves right away, - # so we need to wait for build to be loaded - buildObserver = -> - if build = model.get('build') - @controllerFor('build').set('build', build) - repo.set('build', build) - - model.removeObserver('build', buildObserver) - model.addObserver('build', this, buildObserver) - buildObserver.apply(this) + if build = model.get('build') + @controllerFor('build').set('build', build) + repo.set('build', build) model: (params) -> - Travis.Job.find(params.job_id) + Travis.Job.fetch(params.job_id) Travis.RepoIndexRoute = Ember.Route.extend Travis.SetupLastBuild, setupController: (controller, model) -> @@ -275,30 +268,13 @@ Travis.RepoRoute = Ember.Route.extend model: (params) -> slug = "#{params.owner}/#{params.name}" - content = Ember.Object.create slug: slug, isLoaded: false, isLoading: true - proxy = Ember.ObjectProxy.create(content: content) - repos = Travis.Repo.bySlug(slug) + Travis.Repo.fetchBySlug(slug) - self = this - - observer = -> - if repos.get 'isLoaded' - repos.removeObserver 'isLoaded', observer - proxy.set 'isLoading', false - - if repos.get('length') == 0 - Ember.run.next -> - self.render('repos/not_found', outlet: 'main') - else - proxy.set 'content', repos.objectAt(0) - - if repos.length - proxy.set('content', repos[0]) - else - repos.addObserver 'isLoaded', observer - - proxy + actions: + error: -> + Ember.run.next this, -> + @render('repos/not_found', outlet: 'main') Travis.IndexRoute = Ember.Route.extend renderTemplate: -> @@ -312,6 +288,10 @@ Travis.IndexRoute = Ember.Route.extend @container.lookup('controller:repos').activate() @container.lookup('controller:application').connectLayout 'home' +Travis.IndexLoadingRoute = Ember.Route.extend + renderTemplate: -> + @render('index_loading') + Travis.StatsRoute = Ember.Route.extend renderTemplate: -> $('body').attr('id', 'stats') diff --git a/assets/scripts/lib/travis/ajax.coffee b/assets/scripts/lib/travis/ajax.coffee index e856d364..00c32f01 100644 --- a/assets/scripts/lib/travis/ajax.coffee +++ b/assets/scripts/lib/travis/ajax.coffee @@ -59,7 +59,7 @@ Travis.ajax = Em.Object.create options = $.extend(options, Travis.ajax.DEFAULT_OPTIONS) if testMode? - console.log('RUnning ajax with', options.url) + console.log('Running ajax with', options.url) # we use jquery.mockjax for test, I don't want to hack it or rewrite it, # so let's just pretend we still use ajax if testing mode is on