来自Angular Service / Factory的链接和返回数组的问题

时间:2017-01-11 10:16:28

标签: javascript angularjs angular-services

我正在尝试创建一个服务,该服务将采用日期范围,并返回一个数周的数组。

我现在处于链接我的服务函数的位置,返回数组(它没有链接,但是我无法返回数组),而且正是在这种链接中我得到了一个错误:< 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]);
        }
    }

})();

创建周数组的顺序如下:

  1. createArray(data)然后将结果传递给
  2. createGroupObject(arr)然后将结果传递给
  3. createGroupedArray(groupedObj)返回数组;
  4. 可能有一种更简单的方法,我的方法可能有缺陷。所以我非常感谢你的帮助!

1 个答案:

答案 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;