2014-12-29 91 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是的,這是關於promise的最酷的事情之一,它允許一個'then'塊修改或返回完全新的承諾,交給下一個處理程序。 – dfsq

+0

謝謝!這麼簡單,但這讓我搜索了一個多小時。我也贊同帕特里克的回答,這實際上是一樣的。 – rept

3

無需創建一個額外的延遲和承諾(見Forgotten Promisepromise 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; 
     }); 
    } 
    } 
});