javascript - 从 Angular 服务/工厂链接和返回数组的问题

标签 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) 返回数组;

可能有更简单的方法,但我的方法可能有缺陷。因此,我将非常感谢您的帮助!

最佳答案

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/

相关文章:

javascript onclick 调用函数

javascript - 使用angularJS获取表中行的索引

javascript - 文本区域中的移动数字键盘 [0-9]

angularjs - 为什么我的服务无法仅在我的一个 Controller 中正确加载?

angular - 我应该在注入(inject)的 Angular 服务上使用 readonly 而不是将它们公开吗?

javascript - 为什么我们需要 Angular 服务

javascript - 使用 $emit 刷新父数据时,AngularJS 子 Controller 数据未加载到 UI 上

javascript - Chrome 扩展程序无法在按下按钮时注入(inject)代码

javascript - 无法在 JavaScript 中添加 onclick 事件

angular - 如何在 Angular 6 服务中发出 Http 请求