异步角度承诺和变量初始化

时间:2015-01-28 17:35:53

标签: javascript angularjs asynchronous angular-promise

我有一个看起来像这样的工厂:

app.factory('thingFactory', function($http) {

    var factory = {};   
    var things = [];

    factory.refreshThings = function() {
        return $http.post('/GetThings');
    }

    factory.initializeThings = factory.refreshThings()
        .then(function(response) {
            things = response.data;
        }, function(response){
            // some error handling code here...
        });

    factory.getThings = function() {
        return things;
    }

    return factory;
}

和控制器

app.controller('myController', function($scope, thingFactory) {
    $scope.things = thingFactory.getThings();
}

由于promises的异步性质以及其他正在初始化的集合(除things之外),我是否应该关注getThings()返回一个空数组,从而在{{{}之前返回1}}通话已解决?

这是一个更好的选择吗?

$http.post()

是否有一个安全的替代方案,我可以让控制器不去考虑承诺并且安全地从工厂获得收集品?

1 个答案:

答案 0 :(得分:1)

你的代码肯定会有问题。在控制器使用工厂之前,工厂不会被实例化,因此在控制器调用{}之前不会初始化things,此时initializeThings将在您调用{{1}之前被调用,这可能会返回一个空数组。此外,遵循“让我们希望它在那里”的方法永远不是一个好主意。

我看到你可以采取两种方法:getThings接受一个回调作为参数,或者它返回一个promise,它看起来像这样:

  1. 回调 - 我更喜欢回应而不是承诺,但这是个人的事情。另外,我使用NodeJS启发的语法:

    getThings
  2. 承诺 - 不是最好的语法,但你明白了

    var things; // no need to initialize array
    
    // callback -> function (error, things) {}
    factory.getThings = function (callback) {
      if (things) {
        return callback(null, things);
      }
    
      factory.refreshThings()
        .then( function (response) {
            things = response.data;
            return callback(null, things);
        }, function (reason) {
            return callback(reason);
        });
    }
    
  3. 作为旁注,如果您使用的是RESTful API,则应使用GET来获取信息而不是POST。