2014-04-11 83 views
0

我想了解爲什麼AngularJS $ http服務成功回調給我一個比$ .ajax成功回調慢的響應時間。

我觸發此代碼5次型動物JSON文件:

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

阿賈克斯成功= 361

與$ HTTP:

HttpService的成功= 325

HttpService的成功= 357

HttpService的成功= 380

HttpService的成功= 430

httpService s訪問= 538

我知道Angulars使用承諾來處理回調......它可以解釋爲什麼響應時間在增加?也許我不明白如何最好地使用$ http服務。

我接受建議和anaylsis。

謝謝你的時間。

編輯:我注意到,當成功回調中有數據或函數要處理時,響應時間增加得更多。這就像Angular在處理其他成功回調之前掛起...

+0

jQuery使用承諾來處理回調也使用jQuery Deferred對象。響應時間與這裏的承諾無關...... –

回答

0

$ http服務不是$ .ajax的1:1替代品。它有更多的功能,並且具有一些不同的特性,例如攔截器,XSRF標記處理和自定義緩存概念。它也排隊請求,所以如果你立即發出5個請求,並行,你肯定會看到與$ .ajax不同的行爲。

在這方面的膽量,這將通過承諾,然後通過$ browserDefer,又名瀏覽器#延期。當這一切都完成後,它會以名爲completeOutstandingRequest的程序結束......這裏是對您負面的行爲開始觸發的地方。這是在一個「setTimeout」回調中執行的,這是一種協作式多任務技術,可以讓當前線程在排隊請求開始處理之前返回。這項技術幾乎肯定是你拖延的根源......但在這裏做好公民行爲也有很大的好處。

添加更多承諾並不是真的要解決這個問題。其他要探索的事情:爲什麼後端如此緩慢?在大多數API調用中我們習慣於80毫秒週轉的土地上,400ms是永恆的。另外,爲什麼你需要像這樣並行5個電話?這顯然是低效的 - 即使是.ajax的例子也不是很好。你有沒有辦法將這些分批處理成單個呼叫?那會一箭雙鵰。