AngularJS-解析多个。然后从工厂数据进入控制器
我有一个控制器调用工厂中的任何一组指定方法来检索给定日期的信息。其中一些方法迭代JSON文件以返回承诺。请参阅下面的工厂,其中仅详述了两种方法AngularJS-解析多个。然后从工厂数据进入控制器,angularjs,angularjs-scope,angularjs-controller,Angularjs,Angularjs Scope,Angularjs Controller,我有一个控制器调用工厂中的任何一组指定方法来检索给定日期的信息。其中一些方法迭代JSON文件以返回承诺。请参阅下面的工厂,其中仅详述了两种方法 emmanuel.factory('DayService', function($http, $q){ var obj = {}; obj.dayInWeek = function(d){ // receives
emmanuel.factory('DayService', function($http, $q){
var obj = {};
obj.dayInWeek = function(d){
// receives a mm/dd/yyyy string which then it converts it to day object to parse the weekday value
var date = new Date(d);
var weekday = new Array(
'sunday',
'monday',
'tuesday',
'wednesday',
'thursday',
'friday',
'saturday'
);
return weekday[date.getDay()];
}
obj.season = function(d){
// receives a mm/dd/yyyy string parses against Calendar service for liturgical season
var day = new Date(d).getTime();
//$window.alert(day);
var promise = $q.defer();
$http.get('content/calendar.json').success(function(data) {
//$window.alert(data.calendar.seasons.season.length);
for (var i=0; i<data.calendar.seasons.season.length; i++){
var start = new Date(data.calendar.seasons.season[i].start);
var end = new Date(data.calendar.seasons.season[i].end);
end.setHours(23,59);
//$window.alert(start +'-'+ end +' || '+ day);
if (day >= start && day <= end){
//$window.alert(data.calendar.seasons.season[i].name);
var temp = data.calendar.seasons.season[i].name;
promise.resolve(temp);
//$window.alert(promise);
break;
}
}
});
return promise.promise;
}
obj.weekInSeason = function(d){
/*...
return promise.promise;
*/
}
obj.holiday = function(d){
/*...
return promise.promise;
*/
}
return obj;
});
如何从factory promise中检索数据(单个方法或作为完整的$scope.date模型?使用
$q.all
):
然后像这样使用然后:
getData(today).then(function(aggregatedData){
$scope.resultFromWeekInSeason = aggregatedData[0];
$scope.resultFromSeason = aggregatedData[1];
});
请注意,这将仅在两个调用都成功时解决,即调用同时进行 承诺一旦解析为一个值,我相信无法更改,但您正在尝试用不同的值在for循环中一次又一次地解析相同的承诺。我不确定您的场景是如何工作的,但您可以使用promise通知机制,在for循环中执行此操作
承诺通知(临时)代码>
在循环之后呢
promise.resolve({})代码>
您可以在then的第三个参数中捕获进度
then(successCallback、errorCallback、notifyCallback)
另一个选项是将temp
值整理到for循环内的数组中
最后,我要说的是:承诺。解决(allTemps)
谢谢大家的帮助。我遇到的问题与反复在$scope上声明模型有关,而不是多次承诺
每次我重新声明$scope.date={attr:…}
时,我都会删除所有以前的属性值,因此只留下最后一个声明来包含任何值。向Angular$scope模型声明多个属性值的正确方法是
$scope.date={
工作日:DayService.dayInWeek(今天),
季节:日间服务。季节(今天),
周数:周,
每周:第%2周,
假日:日间服务。假日(今天),
nextDay:DayService.nextDay(今天)
}
看看这个,只是为了澄清,:getData
作为一个单独的方法进入工厂,调用并收集每个工厂中的所有其他承诺?如果是这样,我是否仍然遵守return promise.promise代码>在每个方法中?是的,遵守每个方法中的承诺,您的服务方法不应该改变。但是您应该从这些方法中的每一个返回promise.resolve(someData)。我无法从控制器中的aggregatedData中获取任何信息。是否有方法引用此工厂。或者实际上是在叫工厂的名字obj.getData=function(d){返回$q.all([this.dayInWeek(d)、this.nextDay(d)、this.season(d)、this.weekInSeason(d)、this.holiday(d)、this.date(d)]代码>这很难理解。我创建了一个。提前谢谢
getData: function (today) {
return $q.all([
DayService.weekInSeason(today),
DayService.season(today)
]);
};
getData(today).then(function(aggregatedData){
$scope.resultFromWeekInSeason = aggregatedData[0];
$scope.resultFromSeason = aggregatedData[1];
});