如果响应为202,则返回新的承诺并在Ember Data中等待

时间:2014-08-29 17:53:03

标签: ajax ember.js coffeescript ember-data promise

我们的应用程序中有一个导入过程,由后台服务器处理,但由用户在我们的Ember应用程序中启动。如果转换后导入过程尚未完成,我想发回202响应并让Ember在500毫秒内重新尝试该请求。

我想使用Ember的内部功能来处理此问题(加载路径和常规模型设置器),因此我尝试覆盖RESTAdapter.ajax方法。我在尝试加载路由时,目前收到通用错误Error while processing route: import。我怎样才能实现这种行为?

App.ApplicationAdapter = DS.ActiveModelAdapter.extend
  ajax: (url, type, options) ->
    adapter = this
    new Ember.RSVP.Promise((resolve, reject) ->
      hash = adapter.ajaxOptions(url, type, options)
      hash.success = (json, textStatus, jqXHR) ->
        # begin modifications
        if jqXHR and jqXHR.status is 202
          return Ember.run.later adapter, (->
            this.ajax(url, type, options)
          ), 500
        else
          # end modifications
          return Ember.run null, resolve, json

      hash.error = (jqXHR, textStatus, errorThrown) ->
        Ember.run null, reject, adapter.ajaxError(jqXHR)

      Ember.$.ajax hash
    , "DS: RESTAdapter#ajax " + type + " to " + url)

1 个答案:

答案 0 :(得分:0)

通过在我的路由的beforeModel方法中检查我的服务器上的端点,我能够获得所需的功能。如果服务器仍在处理后台作业,则路由器将中止转换并转换到辅助路由,该辅​​助路由向用户显示一条好消息,并持续检查服务器上的端点,直到该过程完成。完成后,它会转换回原始路线。

App.ImportRoute = Ember.Route.extend
  beforeModel: (transition) ->
    router = @
    $.get('/import/loading', "json").done (data)->
      if data
        transition.abort()
        router.transitionTo('importGateway')
  model: (params) ->
    @store.find('myModel')

App.ImportGatewayController = Ember.ObjectController.extend
  init: ->
    @getStatus()
  getStatus: ->
    controller = @
    $.get('/import/loading', "json").done (data)->
      if data
        Ember.run.later controller, (-> @getStatus()), 500
      else
        controller.transitionToRoute('import')