$ http清空回复

时间:2016-10-26 08:00:01

标签: javascript angularjs ajax

我正在开发一个显示分页照片列表的AJAX Angular应用程序。其中大部分都运行良好,但我遇到了一个我以前从未见过的问题:一旦加载,服务器中的一些数据在$ http调用过程中消失。经过分析,我认为响应转换出现了问题(见下文)。

在这种情况下,控制器调用一个JSON对象,该对象包含一个id列表(按日期排序)和基础中的照片总数。每次用户更改页面时都会进行此调用。

第一次(即,在页面加载时),它工作正常,但一旦页面更改它就会出错。它确实从服务器加载数据,并返回所述对象:这个对象确实给了我总数 - 但提供了一个空数组而不是所需的id列表。


// The first call returns a valid data object like this one (example for 10 ids per page):
// { "mostRecent" : [ 156, 161, 169, 178, 179, 181, 182, 183, 192, 203 ], "total" : 1653 }
// The second time returns a similar object but with an empty array of size 10, as follows:
// { "mostRecent" : [], "total" : 1653 }

此控制器功能调用与我的服务器通信的Photo服务。


app.controller( 'PhotoManagerController', [ '$scope', '$q', 'Photo', function ( $scope,  $q, Photo ) {

  /**
   * Returns a serie of ids for the page.
   * @param params Parameters for the AJAX call (pagination, etc...)
   * @param init whether it is the first time the function is called or not.
   * @return a promise returning the ids.
   */
  var retrieveIds = function ( params, init ) {

    return Photo.getIds( params.pagination )
      .then( function ( response ) {

        // At this point, the data is valid the first time and incomplete the second time.

        if ( init ) { total = response.data.total;  }

        var loadedIds = response.data.mostRecent;

        return $q( function ( resolve ) { resolve( loadedIds ); } );
      } );
  };

} );

照片服务:


app.factory( 'Photo', [ '$http', '$q', 'SERVER_ROUTES', function ( $http, $q, SERVER_ROUTES ) {

  return {

    getIds : function ( pagination ) {
      var params = {};
      if ( pagination ) { 
        params.params = { 'c' : pagination.c, 'p' : pagination.p }; 
      }
      return $http.get( url + SERVER_ROUTES.PHOTO.GET_IDS, params );
    }

  };

} );

我检查了各种各样的事情:

  • 调用Photo.getIds()时,服务器会返回数据。
  • 我想知道我的异步调用的顺序是否有问题,但是在插入断点来检查进程之后我找不到任何类型的东西。

经过分析,我认为问题来自于$ http 的transformResponse对象。我将查询更改为使用$ http({})和transformResponse参数,并在此函数中看到对第二个调用DID的响应首先包含具有完整数组ID的预期对象。

我不知道问题的根源是什么,主要是考虑到它第一次运作良好。我想这是由$ http的默认transformResponse函数之一引起的,但是哪一个?

1 个答案:

答案 0 :(得分:1)

回答有点晚:-)

对于可能遇到类似问题的任何人:问题是由多种原因引起的,即我公司当时使用的Firefox版本(46.7,从46.9版本开始问题消失)和中央身份验证服务(CAS) 用于登录该公司生产的软件。

当后来的应用程序表现出类似的行为时,它通过预先对有问题的请求进行初步的 AJAX 调用来解决。