我有一个范围变量,它是在一些请求之后设置的,并且经过这样的逻辑执行之后
$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
具有值后执行?
答案 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允许您创建一个承诺,可以通过设置值随时解析。请注意,每个承诺只能调用一次