我正在尝试创建一个采用日期范围并返回周数组的服务。
我现在正在链接我的服务函数以返回数组(它可以在没有链接的情况下工作,但我不能返回数组),正是在这个链接中我收到了一个错误:< 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]);
}
}
})();
周数组的创建顺序如下:
- createArray(data) 然后将结果传递给
- createGroupObject(arr) 然后将结果传递给
- createGroupedArray(groupedObj) 返回数组;
可能有更简单的方法,但我的方法可能有缺陷。因此,我将非常感谢您的帮助!
最佳答案
JavaScript 中的排序函数不返回 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;
关于javascript - 从 Angular 服务/工厂链接和返回数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41588092/