服务承诺由控制器值解决

时间:2016-03-16 08:22:59

标签: angularjs promise

所以我有一个服务mainService,其中存在创建承诺的函数:

    this.myPromise = function() {

        var deferred = $q.defer();
        var promise = deferred.promise;

        return promise;

    }

我有一个控制器secondController,我希望我的代码在承诺解决后运行

mainService.myPromise()
.then(filterpanel)

function filterpanel(handle) { ... }

我还有一个mainController,我想运行一些代码,当代码成功时,我想解决我服务中的承诺

function count (a * b) {

    if ((a * b) === 10) {

        mainService.myPromise('ok');

    }

}

我试图将myPromise更改为类似的东西,但这似乎不起作用。任何想法我怎么能做到这一点?

    this.myPromise = function(data) {

        var deferred = $q.defer();
        var promise = deferred.promise;

        if (data) {

            deferred.resolve('ok');

        }

        return promise;

    }

编辑:为什么我需要这是因为当我的应用程序加载时,我通过websocket连接到另一个应用程序。

与该应用程序通信分三步进行

  1. 打开与应用的连接
  2. 打开文档
  3. 制作一个空物件
  4. 每一步都返回一个唯一的句柄(ID),需要句柄才能进入下一步1> 2> ......

    在第3步之后,需要将唯一ID发送给另一个控制器。

    我现在的问题是,在完成这3个步骤之前,其他控制器secondController已经启动,所以我还没有正确的句柄。

    这就是为什么我应该做出承诺,以便secondController等到第一个控制器具有正确的ID。

1 个答案:

答案 0 :(得分:0)

如果你没有找到你需要它的原因,那么你的问题就解决了。

jsfiddle上的实例。



angular.module('ExampleApp', [])
  .controller('ExampleController', function($scope, mainService) {
    $scope.text = "ok";
    $scope.action = function() {
      mainService.resolve($scope.text);
    }
  })
  .controller('SecondController', function($scope, mainService) {
    $scope.subscribe = function() {
      mainService.myPromise().then(filterpanel);
    }

    function filterpanel(handle) {
      $scope.textFromExampleCtrl = handle;
      console.log('from SecondController', handle);
    }
  })
  .service('mainService', function($q) {
    var promise = null;
    var deferred = null;
    return {
      myPromise: function() {

        deferred = $q.defer();
        promise = deferred.promise;

        return promise;

      },
      resolve: function(val) {
        if (deferred)
          deferred.resolve(val);
      }
    }
  });

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<div ng-app="ExampleApp">
  <div ng-controller="ExampleController">
   <input ng-model="text">
    <button ng-click="action()">
      Action
    </button>
  </div>
  <div ng-controller="SecondController">
    <button ng-click="subscribe()">
      run Promise
    </button>
    {{textFromExampleCtrl}}
  </div>
</div>
&#13;
&#13;
&#13;