我可以创建一个承诺,检查变量是否设置为角度?

时间:2016-02-15 06:04:12

标签: javascript angularjs q

我有一个范围变量,它是在一些请求之后设置的,并且经过这样的逻辑执行之后 $scope.record = {};

$scope.record.field = "custom_value";

现在我有一个不同的功能,它独立于此执行执行。

function test(){ if($scope.record.field == 'some_value') { // do something }}

问题是只有在$ scope.record.field有值后才应检查if条件。

我尝试将它放在$ q中,就像这样$q.all($scope.record.field).then(func)但是它不起作用。

我也尝试过使用$q.when($scope.record.field).then(func),但它仍无效。

两次我都得到了未定义的值。

我不想在设置$ scope.record.field的部分放置任何代码,这表示赋值完成,因为我希望将两个部分保持独立和独立。他们两个都可以访问相同的范围。

如何确保我的代码的某些部分仅在$scope.record.field具有值后执行?

1 个答案:

答案 0 :(得分:2)

可能实施的片段



//one of the ways you could do that
'use strict';

(function() {

    function MyService($q, Util) {
       var trackThis;
       var deferred;
       var methods = {
          setValue(val){
            trackThis = val;
            if (deferred) deferred.resolve(val);
          },
          listenForValue(val){
            deferred = $q.defer();
            return deferred.promise;
          }
       }
       return methods;
    }

    angular.module('myApp')
        .factory('MyService', MyService);

})();




修改 假设你有一个如下控制器:



'use strict';

(function() {

class MyController {
  constructor(MyService, AnotherService) {
 
    MyService.listenForValue().then(function(value){ 
//do whatever you want with the value
    });
    // Now introduce have another guy setting the value
    AnotherService.fetchValue(function(value){
       MyService.setValue(value); //this guys will resolve the previous promise
    });
  }
}

angular.module('myApp')
  .controller('MyController', MyController);

})();




注意:添加验证以防止可能出现的问题

备注:基本上,您创建的服务允许您在不同的活动控制器之间共享状态,MyService允许您创建一个承诺,可以通过设置值随时解析。请注意,每个承诺只能调用一次