2017-01-11 8 views
2

Я пытаюсь создать службу, которая будет принимать диапазон дат и вернуть массив недель.Проблема с цепочкой и возвращаемым массивом из Angular Service/Factory

Я сейчас в точке, где я связываю свои сервисные функции, чтобы вернуть массив (он работает без цепочки, но я не могу вернуть массив), и именно в этой цепочке я получаю сообщение об ошибке: ТипError: data.map (...). Sort (...). То не функция.

Это моя служба/завод вызов:

$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 (данные), а затем передать результат в
  2. createGroupObject (ARR), а затем передать результат в
  3. createGroupedArray (groupedObj) возвращают массив;

Возможно, существует более простой способ сделать это, и мой подход может быть ошибочным. Поэтому я буду очень благодарен за вашу помощь!

ответ

1

Функция сортировки в JavaScript не возвращает обещание, поэтому вы не можете использовать функцию , а затем функцию сразу после ее вызова, и на самом деле вам даже не нужно. Поскольку вся ваша обработка не содержит каких-либо асинхронных вызовов, вы можете просто приковать ваши вызовы функций следующим образом:

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 функции в противном случае он выиграл» t return anything:

return groupedObj; 
+0

Благодарим за помощь! :) – onmyway

+0

Добро пожаловать. –