被所有的承诺困惑

时间:2014-12-29 20:43:02

标签: javascript angularjs

我有以下工厂。它还有一个返回允许时间数组的函数(根据调用返回的信息计算)。我想在模板中提供此信息,如何在控制器中执行此操作?

.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
    })

2 个答案:

答案 0 :(得分:3)

如果要将then方法链接到Company.allowed_times()调用的结果,allowed_times必须返回一个promise对象。是的,它不会返回undefined。修复很简单,您只需要返回myCompany.$promise.then(function() {...})

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

有一件事:如果你使用then方法,请记住从中返回,它将成为传递给下一个then电话的新承诺。

答案 1 :(得分:3)

无需创建额外的延期和承诺(请参阅promise anti-patterns中的Forgotten Promise

只需从资源调用中返回承诺:

.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;
      });
    }
  }
});