【问题标题】:AngularJS $http vs. $.ajax callback response timeAngularJS $http 与 $.ajax 回调响应时间
【发布时间】:2014-07-16 01:24:32
【问题描述】:

我试图理解为什么 AngularJS 的 $http 服务成功回调给我的响应时间比 $.ajax 成功回调慢。

我使用不同的 json 文件触发此代码 5 次:

if(isJquery){
  $.ajax({
    type : 'GET',
    url : url1,
    async : true,
    beforeSend: function(xhr){
         xhr.setRequestHeader('Content-Type',  'application/json;charset=UTF-8');
          xhr.setRequestHeader('Access-Token',  token);
     },
      success : function (returnData) {
            Chrono.getTime('ajax success')
     },
      error : function (xhr, textStatus, errorThrown) {
       },
      complete : function (){

        }
       });
   }else{
       var configuration = {
           method: 'GET',
           url: url1
        };

        var headers = {};
             headers['Content-Type'] = 'application/json;charset=UTF-8';
              headers['Access-Token'] = token;
              configuration.headers = headers;

        $http(configuration)
           .success(
            function (data, status, headers, config) {
                   Chrono.getTime('httpService success')
              })
            .error(function (data, status, headers, config) {
             });
}

使用 ajax 我收到了这个响应时间:

ajax 成功 = 332

ajax 成功 = 335

ajax 成功 = 336

ajax 成功 = 337

ajax 成功 = 361

使用 $http :

httpService 成功 = 325

httpService 成功 = 357

httpService 成功 = 380

httpService 成功 = 430

httpService 成功 = 538

我知道 Angulars 正在使用 Promise 来处理回调......它可以解释为什么响应时间会增加吗?也许我不明白如何最好地使用 $http 服务。

我愿意接受建议和分析。

感谢您的宝贵时间。

编辑:我注意到当成功回调中有数据或函数要处理时,响应时间会增加更多。就像 Angular 在处理其他成功回调之前挂起一样......

【问题讨论】:

  • jQuery 也在使用 jQuery Deferred 对象使用 Promise 来处理回调。响应时间与这里的承诺无关......

标签: jquery angularjs


【解决方案1】:

$http 服务不是 $.ajax 的 1:1 替代品。它做得更多,并具有一些不同的特性,例如拦截器、XSRF 令牌处理和自定义缓存概念。它还对请求进行排队,因此如果您立即并行发出 5 个请求,您肯定会看到与 $.ajax 不同的行为。

从本质上讲,这将通过 Promise 向下路由,然后通过 $browserDefer,又名 browser#defer。当这一切都完成后,它会在一个名为completeOutstandingRequest...的例程中结束,这就是对您不利的行为开始被触发的地方。这是在“setTimeout”回调中执行的,这是一种协作多任务技术,可让当前线程在排队的请求开始处理之前返回。几乎可以肯定,这种技术是延迟的根源……但在这里有良好的公民行为也有很大的优势。

添加更多的 Promise 并不能真正解决这个问题。其他需要探索的东西:为什么后端这么慢?在我们习惯于大多数 API 调用的 80 毫秒周转时间的土地上,400 毫秒是永恒的。另外,为什么你需要像这样并行进行 5 个调用?这显然是低效的——即使是 $.ajax 示例也不是那么好。有没有办法可以将这些批处理到一个调用中?那就是一块石头杀死两只鸟。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多