我有一个服务,我从服务器提取数据。当我单击按钮通过此服务向服务器发送请求时,窗口会冻结,直到我收到服务器的响应。有什么办法可以让这个请求异步吗?
这是我的服务。
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
});
}
答案 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 = ""
}