Javascript AngularJS-轮询到持久数据存储
这里有个角。我正在构建一个应用程序,它需要每秒轮询一个url,并持久存储该数据,因为它需要由多个视图/控制器访问 我所做的是将我的http请求放入工厂,然后通过工厂中的函数将数据提供给控制器。我现在遇到的问题是,工厂函数在http请求之前被调用,导致我的应用程序出错 代码如下:Javascript AngularJS-轮询到持久数据存储,javascript,angularjs,http,polling,Javascript,Angularjs,Http,Polling,这里有个角。我正在构建一个应用程序,它需要每秒轮询一个url,并持久存储该数据,因为它需要由多个视图/控制器访问 我所做的是将我的http请求放入工厂,然后通过工厂中的函数将数据提供给控制器。我现在遇到的问题是,工厂函数在http请求之前被调用,导致我的应用程序出错 代码如下: App.factory('metrics', function($http){ var service; var users = [{laps:[]}]; var updateMetrics =
App.factory('metrics', function($http){
var service;
var users = [{laps:[]}];
var updateMetrics = function(){
//updates the users array in the factory
};
$http.get('data.csv').success(function(data) {
var temp_array = data.split(" ");
updateMetrics(0, temp_array);
});
service.lastLapInfo = function(){
var lastlap = [];
for (var i=0; i<users.length;i++)
{
var lap = users[i].laps[users[i].laps.length-1];
lastlap.push(lap);
}
return lastlap;
};
return service;
});
App.controller('mainController', function($scope, $http, metrics) {
$scope.users=metrics.lastLapInfo();
});
App.factory('metrics',函数($http){
var服务;
var用户=[{laps:[]}];
var updateMetrics=函数(){
//更新工厂中的用户阵列
};
$http.get('data.csv')。成功(函数(数据){
var temp_数组=data.split(“”);
updateMetrics(0,临时数组);
});
service.lastLapInfo=函数(){
var lastlap=[];
对于(var i=0;i,如果您没有立即获得数据,可以通过在返回值(null
,undefined
,[]
)中指示它来处理,或者在最初获取数据之后存储并解析
大概是
var deferred = null;
$http.get(...).then ({
if (deferred) {
deferred.resolve(result);
deferred = null;
}
});
service.lastLapInfo = function(){
if (no metrics) {
deferred = $q.defer()
return deferred;
}
else {
return metrics;
}
};
应该有效,这取决于您想要如何构建它
编辑:从注释中链接$q
。如果您没有立即获得数据,可以通过在返回值(null
,未定义的
,[]
)中指示它来处理,或者在最初获取数据后存储并解析
大概是
var deferred = null;
$http.get(...).then ({
if (deferred) {
deferred.resolve(result);
deferred = null;
}
});
service.lastLapInfo = function(){
if (no metrics) {
deferred = $q.defer()
return deferred;
}
else {
return metrics;
}
};
应该有效,这取决于您想要如何构建它
编辑:从注释中链接$q
。如果您没有立即获得数据,可以通过在返回值(null
,未定义的
,[]
)中指示它来处理,或者在最初获取数据后存储并解析
大概是
var deferred = null;
$http.get(...).then ({
if (deferred) {
deferred.resolve(result);
deferred = null;
}
});
service.lastLapInfo = function(){
if (no metrics) {
deferred = $q.defer()
return deferred;
}
else {
return metrics;
}
};
应该有效,这取决于您想要如何构建它
编辑:从注释中链接$q
。如果您没有立即获得数据,可以通过在返回值(null
,未定义的
,[]
)中指示它来处理,或者在最初获取数据后存储并解析
大概是
var deferred = null;
$http.get(...).then ({
if (deferred) {
deferred.resolve(result);
deferred = null;
}
});
service.lastLapInfo = function(){
if (no metrics) {
deferred = $q.defer()
return deferred;
}
else {
return metrics;
}
};
应该有效,这取决于您想要如何构建它
编辑:从注释链接$q
。这是承诺的典型用例
以下方法使用返回承诺的工厂:
App.factory('metrics', function($http){
var service;
...
service.load = function () {
return $http.get('data.csv');
});
return service;
});
然后,在控制器中调用度量服务,并利用承诺:
App.controller('mainController', function($scope, $http, metrics) {
metrics.load().then(function(response) {
// at this point you know for sure that the request has terminated
// you can call the service again to run lastLapInfo or do the logic in here.
});
});
这是承诺或angular的典型用例
以下方法使用返回承诺的工厂:
App.factory('metrics', function($http){
var service;
...
service.load = function () {
return $http.get('data.csv');
});
return service;
});
然后,在控制器中调用度量服务,并利用承诺:
App.controller('mainController', function($scope, $http, metrics) {
metrics.load().then(function(response) {
// at this point you know for sure that the request has terminated
// you can call the service again to run lastLapInfo or do the logic in here.
});
});
这是承诺或angular的典型用例
以下方法使用返回承诺的工厂:
App.factory('metrics', function($http){
var service;
...
service.load = function () {
return $http.get('data.csv');
});
return service;
});
然后,在控制器中调用度量服务,并利用承诺:
App.controller('mainController', function($scope, $http, metrics) {
metrics.load().then(function(response) {
// at this point you know for sure that the request has terminated
// you can call the service again to run lastLapInfo or do the logic in here.
});
});
这是承诺或angular的典型用例
以下方法使用返回承诺的工厂:
App.factory('metrics', function($http){
var service;
...
service.load = function () {
return $http.get('data.csv');
});
return service;
});
然后,在控制器中调用度量服务,并利用承诺:
App.controller('mainController', function($scope, $http, metrics) {
metrics.load().then(function(response) {
// at this point you know for sure that the request has terminated
// you can call the service again to run lastLapInfo or do the logic in here.
});
});
当你实际拥有数据时,在成功回调中做那些事情。当你实际拥有数据时,在成功回调中做那些事情。当你实际拥有数据时,在成功回调中做那些事情。当你实际拥有数据时,在成功回调中做那些事情。是的。我建议OP看看AngularJS$q是的。我建议OP to看看AngularJS$q是的。我建议OP看看AngularJS$q是的。我建议OP看看AngularJS$q非常酷!扩展这个功能,我如何将http请求设置为每秒轮询?我唯一能想到的是有另一个功能,例如update()在工厂中,以特定的间隔从使用工厂的每个控制器调用该函数。有更好的方法吗?您可以使用$interval service在服务中重复加载加载方法。这里将进一步解释:这里有一个示例。谢谢!这就是我需要的非常酷!扩展它我该怎么做设置http请求每秒轮询一次?我唯一能想到的是使用另一个函数,例如update()在工厂中,以特定的间隔从使用工厂的每个控制器调用该函数。有更好的方法吗?您可以使用$interval service在服务中重复加载加载方法。这里将进一步解释:这里有一个示例。谢谢!这就是我需要的非常酷!扩展它我该怎么做设置http请求每秒轮询一次?我唯一能想到的是使用另一个函数,例如update()在工厂中,以特定的间隔从使用工厂的每个控制器调用该函数。有更好的方法吗?您可以使用$interval service在服务中重复加载加载方法。这里将进一步解释:这里有一个示例。谢谢!这就是我需要的非常酷!扩展它我该怎么做设置http请求每秒轮询一次?我唯一能想到的是使用另一个函数,例如update()在工厂中,以特定的间隔从使用工厂的每个控制器调用该函数。有更好的方法吗?您可以使用$interval service在服务中重复加载加载方法。这里将进一步解释:这里有一个示例。谢谢!这就是我需要的