我正在尝试创建一个服务,该服务将采用日期范围,并返回一个数周的数组。
我现在处于链接我的服务函数的位置,返回数组(它没有链接,但是我无法返回数组),而且正是在这种链接中我得到了一个错误:< strong> TypeError:data.map(...)。sort(...)。then不是函数。
这是我的服务/工厂电话:
$scope.weeks = GroupDateRangeService.createArray(timeline_data);
这是我的服务/工厂:
(function () {
'use strict';
angular
.module('portalDashboardApp')
.factory('GroupDateRangeService', GroupDateRangeService);
GroupDateRangeService.$inject = [];
function GroupDateRangeService() {
var service = {
createArray: createArray,
};
return service;
function createArray(data) {
var arr = data.map(function (s) {
var week = getWeekNumber(parseISOLocal(s));
return week[0] + ('0' + week[1]).slice(-2) + ':' + s;
}).sort()
.then(function () {
createGroupObject(arr);
})
.then(function () {
createGroupedArray(groupedObj)
})
return groupedArray;
};
function createGroupObject(arr) {
var groupedObj = arr.reduce(function (result, value) {
var b = value.split(':');
if (!result[b[0]]) result[b[0]] = [];
result[b[0]].push(b[1]);
return result;
}, {});
};
function createGroupedArray(groupedObj) {
// Grab arrays in order of week number. Sort keys to maintain order
var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]);
// Final set of grouped dates
console.log(groupedArray.join('\n\n'))
return groupedArray;
}
/* Helper to get the ISO week number of a date
** @param {Date} date to get week of
** @returns {Array} [year, weekNumber]
*/
function getWeekNumber(d) {
d = new Date(+d);
d.setHours(0, 0, 0, 0);
d.setDate(d.getDate() + 4 - (d.getDay() || 7));
var yearStart = new Date(d.getFullYear(), 0, 1);
var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
return [d.getFullYear(), weekNo];
}
/* Parse ISO 8601 format date string to local date
** @param {string} s - string to parse like 2016-12-15
** @returns {Date}
*/
function parseISOLocal(s) {
var b = s.split(/\D/);
return new Date(b[0], b[1] - 1, b[2]);
}
}
})();
创建周数组的顺序如下:
可能有一种更简单的方法,我的方法可能有缺陷。所以我非常感谢你的帮助!
答案 0 :(得分:1)
JavaScript中的sort函数不会返回一个promise,因此你不能在调用之后立即使用 then 函数,实际上你根本不需要它。由于您的所有处理都不包含任何异步调用,因此您可以按如下方式链接函数调用:
function createArray(data) {
var arr = data.map(function (s) {
var week = getWeekNumber(parseISOLocal(s));
return week[0] + ('0' + week[1]).slice(-2) + ':' + s;
}).sort();
return createGroupedArray(createGroupObject(arr));
};
您还需要在 createGroupObject 函数的末尾添加一个return语句,否则它不会返回任何内容:
return groupedObj;