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.
This commit is contained in:
Piotr Sarnacki 2013-12-09 18:34:10 +01:00
parent c751b7a8a4
commit a2bc840292
4 changed files with 27 additions and 37 deletions

View File

@ -135,5 +135,12 @@ require 'travis/model'
repo = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug) repo = $.select(@find().toArray(), (repo) -> repo.get('slug') == slug)
if repo.length > 0 then repo else @find(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) -> # buildURL: (slug) ->
# if slug then slug else 'repos' # if slug then slug else 'repos'

View File

@ -58,7 +58,7 @@ require 'travis/model'
@get('_rawPermissions').then (data) => permissions.set('content', data.push) @get('_rawPermissions').then (data) => permissions.set('content', data.push)
permissions permissions
).property() ).property()
updateLocale: (locale) -> updateLocale: (locale) ->
@save() @save()
Travis.setLocale(locale) Travis.setLocale(locale)
@ -77,7 +77,10 @@ require 'travis/model'
poll: -> poll: ->
Travis.ajax.get '/users', (data) => Travis.ajax.get '/users', (data) =>
if data.user.is_syncing if data.user.is_syncing
Ember.run.later(this, this.poll.bind(this), 3000) self = this
setTimeout ->
self.poll()
, 3000
else else
@set('isSyncing', false) @set('isSyncing', false)
@setWithSession('syncedAt', data.user.synced_at) @setWithSession('syncedAt', data.user.synced_at)

View File

@ -218,7 +218,7 @@ Travis.BuildRoute = Ember.Route.extend
repo.set('build', model) repo.set('build', model)
model: (params) -> model: (params) ->
Travis.Build.find(params.build_id) Travis.Build.fetch(params.build_id)
Travis.JobRoute = Ember.Route.extend Travis.JobRoute = Ember.Route.extend
renderTemplate: -> renderTemplate: ->
@ -236,19 +236,12 @@ Travis.JobRoute = Ember.Route.extend
repo.set('job', model) repo.set('job', model)
repo.activate('job') repo.activate('job')
# since we're no longer using promises, the setupController resolves right away, if build = model.get('build')
# so we need to wait for build to be loaded @controllerFor('build').set('build', build)
buildObserver = -> repo.set('build', build)
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)
model: (params) -> model: (params) ->
Travis.Job.find(params.job_id) Travis.Job.fetch(params.job_id)
Travis.RepoIndexRoute = Ember.Route.extend Travis.SetupLastBuild, Travis.RepoIndexRoute = Ember.Route.extend Travis.SetupLastBuild,
setupController: (controller, model) -> setupController: (controller, model) ->
@ -275,30 +268,13 @@ Travis.RepoRoute = Ember.Route.extend
model: (params) -> model: (params) ->
slug = "#{params.owner}/#{params.name}" 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 actions:
error: ->
observer = -> Ember.run.next this, ->
if repos.get 'isLoaded' @render('repos/not_found', outlet: 'main')
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
Travis.IndexRoute = Ember.Route.extend Travis.IndexRoute = Ember.Route.extend
renderTemplate: -> renderTemplate: ->
@ -312,6 +288,10 @@ Travis.IndexRoute = Ember.Route.extend
@container.lookup('controller:repos').activate() @container.lookup('controller:repos').activate()
@container.lookup('controller:application').connectLayout 'home' @container.lookup('controller:application').connectLayout 'home'
Travis.IndexLoadingRoute = Ember.Route.extend
renderTemplate: ->
@render('index_loading')
Travis.StatsRoute = Ember.Route.extend Travis.StatsRoute = Ember.Route.extend
renderTemplate: -> renderTemplate: ->
$('body').attr('id', 'stats') $('body').attr('id', 'stats')

View File

@ -59,7 +59,7 @@ Travis.ajax = Em.Object.create
options = $.extend(options, Travis.ajax.DEFAULT_OPTIONS) options = $.extend(options, Travis.ajax.DEFAULT_OPTIONS)
if testMode? 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, # 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 # so let's just pretend we still use ajax if testing mode is on