AngularJS $ http ajax请求不是异步的,导致页面挂起

时间:2013-09-27 16:31:19

标签: angularjs asynchronous

我有一个服务,我从服务器提取数据。当我单击按钮通过此服务向服务器发送请求时,窗口会冻结,直到我收到服务器的响应。有什么办法可以让这个请求异步吗?

这是我的服务。

app.factory('service', function($http) {
  return {
    getLogData : function(startTime,endTime){
      return $http({
        url:     baseURL + 'getLogData',
        method:  'GET',
        async:   true,
        cache:   false,
        headers: {'Accept': 'application/json', 'Pragma': 'no-cache'},
        params:  {'startTime': startTime , 'endTime': endTime}
      });
    }
  };
)};

HTML

<button ng-click="getData()">Refresh</button>
<img src="pending.gif" ng-show="dataPending" />

代码

$scope.getData = function(){
  service.getLogData().success(function(data){
    //process data
  }).error(function(e){
    //show error message
  });
}

4 个答案:

答案 0 :(得分:13)

虽然有一些关于你的方法的利弊的争论,但我认为问题在这里得到解答:AJAX call freezes browser for a bit while it gets response and executes success

要测试这是否实际上是问题的一部分,假设一个响应并静态地提供它。我使用Fiddler或WireShark来获取响应,然后保存到像testService.json这样的文件中。 XHR及其所有各种衍生产品(如$ HTTP $ .ajax)将其视为服务,但标题可能略有不同。

答案 1 :(得分:3)

使用成功承诺,并将日志数据包装在一组可附加到$ scope的对象中。

因此,不要让您的服务具有阻止方法,而是让它维护一个“LogEntries”列表。

   // constructor function
   var LogEntry = function() {
      /*...*/
   }

   var logEntries = [];

   // Non-blocking fetch log data
   var getLogData = function() {
        return $http({
            url : baseURL + 'getLogData',
            method : 'GET',
            async : true,
            cache : false,
            headers : { 'Accept' : 'application/json' , 'Pragma':'no-cache'},
            params : {'startTime' : startTime , 'endTime' : endTime}
        }).success(function(data) {;
           // for each log entry in data, populate logEntries
           // push(new LogEntry( stuff from data ))...
        };
   } 

然后在您的控制器中,注入您的服务并引用此服务的日志数据数组,以便Angular将观察它并正确地更改视图

   $scope.logEntries = mySvc.logEntries;

然后在HTML中,只需在logEntries上执行某些操作:

  <p ng-repeat="logEntry in logEntries">
    {{logEntry}}
  </p>

答案 2 :(得分:2)

使用此代码进行配置

$httpProvider.useApplyAsync(true);

答案 3 :(得分:0)

import Foundation
import RealmSwift

class Dog : Object {
  dynamic var name = ""
  dynamic var age = ""
}