2014-12-29 2 views
1

У меня есть следующая фабрика. Он также имеет функцию, которая возвращает массив допустимых времен (вычисление на основе информации, возвращаемой вызовом). Я хочу сделать эту информацию доступной в шаблоне, как это сделать в контроллере?Смущенный всеми обещаниями

.factory('Company', function($resource) { 
    var myCompany = $resource('http://127.0.0.1:3000/api/v1/companies').get(); 

    return { 
    allowed_times: function(){ 
     myCompany.$promise.then(function(data, status){ 
     var list = new Array(); 
     list[list.length] = moment().set('hour', data.settings.work_time_start).set('minute', 0).set('second', 0); 
     endTime = moment().set('hour', data.settings.work_time_end).set('minute', 0).set('second', 0); 
     var currentTime = moment().set('hour', data.settings.work_time_start).set('minute', 0).set('second', 0); 
     while (list[list.length - 1] < endTime) 
     { 
      list[list.length] = moment(list[list.length - 1]).add(data.settings.time_rounding, 'm'); 
     }; 
     return list; 
     }) 
    } 
    } 
}) 

Я уже пробовал разные подходы, это последнее, но выдает сообщение об ошибке (Не удается прочитать свойство «затем» неопределенных).

Company.allowed_times().then(function(data) { 
     $scope.allowed_times = data 
    }) 

ответ

3

Если вы хотите, чтобы цепь then метода к результату Company.allowed_times() вызова, allowed_times должен возвращать объект обещание. Правильно, не возвращается undefined. Исправление просто, нужно просто вернуться myCompany.$promise.then(function() {...}):

allowed_times: function() { 
    return myCompany.$promise.then(function (data, status) { 
     // ... unchanged 
     return list; 
    }); 
} 

Одна вещь: если вы используете then метод, не забудьте вернуться из этого, он станет новым обещанием передается следующему then вызова.

+0

Это очень здорово, не было известно о «* станет новым обещанием, переданным другому, а затем вызовом * ". –

+0

@MarcelGwerder Yep, это одна из самых крутых вещей о обещаниях, которая позволяет одному блоку 'then' изменять или возвращать совершенно новое обещание, которое будет передано следующему обработчику. – dfsq

+0

Спасибо! Так просто, но это застало меня больше часа. Я также поддержал ответ Патрика, который был практически таким же. – rept

3

Нет необходимости создавать дополнительный отложенный и обещание (см Forgotten Promise в promise anti-patterns)

Просто вернуть обещание из вызова ресурса:

.factory('Company', function($resource) { 
    var myCompany = $resource('http://127.0.0.1:3000/api/v1/companies').get(); 

    return { 
    allowed_times: function(){ 
     //return the promise created by this call 
     return myCompany.$promise.then(function(data, status){ 
     var list = []; 

     //populate list with data... 

     return list; 
     }); 
    } 
    } 
}); 
Смежные вопросы