如何在角度中做出延期承诺?

时间:2015-07-09 07:10:49

标签: javascript angularjs

我有3个函数$ scope.one(); $ scope.two(); $ scope.three();

我想:

当一个人完成后,两个人就会执行,

当两个完成时,则会执行三个。

我在谷歌搜索,这可以通过延期处理,但我不知道如何做到这一点。我没有找到清晰简单的解释。

更新

$scope.login = function(){
        $http.post(URL+'auth/login', {email:'dummy@gmail.com', password:'password'}).then(function(response){
            console.log(response.data);
        });
    };

$scope.getData = function(){
        IngredientService.ingredients().then(function (response) {
            console.log(response.data);
        });
    };

2 个答案:

答案 0 :(得分:0)

要回答您的问题,对于执行订单问题,您可以执行以下操作 - 提供所有函数返回承诺。

$scope.one()
  .then($scope.two)
  .then($scope.three);

前切线。

然而,这可能表明存在设计缺陷。一般来说,可能不希望公开在范围级别返回promises的函数 - 范围主要用于与视图交谈,并且视图不能使用promises。您可能想要将$scope.one$scope.two$scope.three中的所有逻辑移动到服务,然后在单个函数内部调用链。

现在,如果要将API公开给作用域的后代,则应该使用控制器并通过指令进行通信。这也是Angular 2.0中实际使用的,完全删除了作用域和控制器 - 我们将拥有的所有指令基本上都有一个控制器,并且可能需要其他指令。

const mod = angular.module('app', []);

class ParentCtrl {
  foo() {
    console.log('it works!');
  }
}

mod.directive('parent', function() {
  return { 
    controller: ParentCtrl
  };
});

mod.directive('child', function() {
  return {
    require: ['^parent'],
    link: function($scope, $element, $attrs, $ctrl) {
      $scope.parent = $ctrl;
    },
    controller: function($scope) {
      // Unfortunately this is the only way to access required controllers from this controller at the moment. However, one could argue that shared logic should *really* go in services, and that the only thing required controllers should be used for is event binding (in the link function).
      $scope.parent.foo();
    }
  };
});

当您公开这样的API时,有时会在此级别公开承诺。有关示例,请参阅我的codepen(查看控制台)。

答案 1 :(得分:-1)

我建议你使用异步模块。特别是瀑布功能,符合您的要求。

https://github.com/caolan/async

<强> [编辑]

您可以使用async执行此操作:

$scope.login = function(callback) {
  if (success) {
    callback();
  } else {
    callback('my error');
  }
}

$scope.getData = function(callback) {
  callback(null, myData);
}

$scope.doIt = function(callback) {
  async.waterfall([$scope.login, $scope.getData], callback);
}