如何从商店回调中获取响应代码?

时间:2013-05-22 14:09:13

标签: extjs extjs4.2

我正在尝试处理会话超时服务器端。 获取会话超时时,我的服务器使用json发回响应 {success: false}, ContentType: 'application/json', ResponseNo: 408

存储

var storeAssets = Ext.create('Ext.data.Store', {
  model : 'modCombo',
  autoLoad : false,
  proxy : { limitParam : undefined,
    startParam : undefined,
    paramName : undefined,
    pageParam : undefined,
    noCache : false,
    type : 'ajax',
    url : '/caricaAssets.json',
    reader : { root : 'data' }
  }
});

在客户端,我处理这样的回调加载商店:

storeAssets.load({
  scope: this,
  callback: function(records, operation, success) {
    if (!success) { Ext.Msg.alert('Error'); }
  }
});

要执行不同的回复,我想改变提醒。 所以,如果回复没有。是408,我可以提醒session expired(依此类推,管理回复号码)。

但我没有找到任何回应的方法。在商店回调!

有什么建议吗?

5 个答案:

答案 0 :(得分:4)

不幸的是,回调方法没有作为参数传入服务器响应。这可能是因为有很多方法可以将数据加载到商店中,并且并非所有方法都会有服务器响应。

您可以覆盖代理的processResponse函数,将服务器的响应与操作对象一起存储,然后在回调中访问它。

Ext.define('Ext.data.proxy.ServerOverride', {
   override: 'Ext.data.proxy.Server',

   processResponse: function (success, operation, request, response, callback, scope) {
      operation.serverResponse = response;
      this.callParent(arguments);
   }
});

然后,获取状态:

storeAssets.load({
   scope: this,
   callback: function(records, operation, success) {
      if (operation.serverResponse.status === 408) {
         Ext.Msg.alert('Session expired');
      }
   }
});

答案 1 :(得分:3)

我知道现在已经很老了,但我遇到了类似的问题。 我发现的解决方案是在代理中监听异常事件。

proxy{
    type: 'ajax',
    reader: {
        type: 'json'
    ,
    listeners: {
        exception: function(proxy, response, options){
            Ext.MessageBox.alert('Error', response.status + ": " + response.statusText); 
        }
    }
}

我还预测我的商店加载回调仅在成功为真时才进行。 希望其他人搜索会发现这有用。

答案 2 :(得分:1)

试试这个(在extjs 4.2.2上)

callback: function (records, operation, success) {
            operation.request.operation.response.status; }

答案 3 :(得分:0)

解决了添加以下代码:

Ext.Ajax.on('requestexception', function(con, resp, op, e){
  if (resp.status === 408) {
    Ext.Msg.alert('Warning', 'Session expired');
  } else {
    if (resp.status === 404) {
      Ext.Msg.alert('Error', Ext.util.Format.htmlEncode('Server not ready'));
    } else {
      if (resp.status !== undefined) {
            Ext.Msg.alert('Error', Ext.util.Format.htmlEncode('Server not found (') + resp.status + ')');
      } else {
            Ext.Msg.alert('Error', 'Server not found');
          }
        }
      }
});

当我调用ajax请求时,服务器会返回此异常捕获的信息。现在我可以处理回调代码了!

答案 4 :(得分:0)

我知道这个问题很“旧”,但在ExtJS 4.2.2中,

callback: function(a,b,c) {}

发生,您可以使用

自动捕获服务器响应

b.error.status

if (!c) {
    if (b.error.status === 401) {
        //logout
    }
}

我不知道它是不是在几年前实现的(在我发布这个帖子之后),但它仍然可以帮助任何人在将来查看这篇文章我猜...