AngularJs范围属性和承诺

时间:2013-07-03 06:51:02

标签: angularjs promise q

我有这段代码:

var geocode = function(value) {
 var request;
 .....
 var dResult = Q.defer();
 geocoder.geocode(request, function (results) {
   dResult.resolve(results);
 });
 return dResult.promise;
};

var cancelWatch;
$scope.$watch('value', function (value) {
 $timeout.cancel(update);
 update = $timeout(function () {
   $scope.geocodedResult = geocode(value);
 }, 300);
});
第15行中的

$ scope.geocodedResult是一个承诺,它迟早会成为结果值,并且范围应该刷新。不幸的是,这不会发生。 如果我这样做,代码就可以了

geocode(value).then(function(result) {
 $scope.geocodedResult = result;
 $scope.$digest();
});

我做错了什么?

更新:

我现在只想使用$ q,但我无法让它工作:

this.getCurrentPosition = function () {
    var dCurrentPosition = $q.defer();
    if (currentPosition) {
        dCurrentPosition.resolve(currentPosition);
    } else {
        navigator.geolocation.getCurrentPosition(function (cp) {
            currentPosition = cp;
            dCurrentPosition.resolve(currentPosition);
        });
    }
    return dCurrentPosition.promise;
};
this.getCurrentLoc = function () {
    return self.getCurrentPosition().then(function (currentPosition) {
        return [currentPosition.coords.longitude, currentPosition.coords.latitude];
    });
};

中的断点
return [currentPosition.coords.longitude, currentPosition.coords.latitude];

在Q

工作正常时永远不会被触发

1 个答案:

答案 0 :(得分:0)

如果你使用Angular的$ q而不是Q,它应该可以工作:

var dResult = $q.defer();
  

$ q promises由角度模板引擎识别,这意味着在模板中,您可以将附加到范围的promise视为结果值。 - $q docs

因此可以将$scope.geocodedResult设置为$ q promise,当解析promise时,scope属性将自动更新。