AngularJs范围属性和承诺

AngularJs范围属性和承诺,angularjs,promise,q,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 (va

我有以下代码:

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];

如果您使用Angular的$Q而不是Q,则在与Q配合使用时将永远不会触发,它应该可以工作:

var dResult = $q.defer();
$q承诺在angular中由模板引擎识别,这意味着在模板中,您可以将附加到作用域的承诺视为结果值。-


因此,
$scope.geocodedResult
可以设置为$q承诺,当承诺得到解决时,范围属性将自动更新。

请将所有相关代码添加到问题中。在不必要的时候远离外部链接。在工作版本中,你没有做错什么。在非工作版本中,您分配承诺就像它是一个结果,但承诺不是这样工作的-它们不会神奇地转变为它们承诺交付的结果。为了在结果到达时处理它,需要调用promise的
.then()
方法,并使用适当的回调。谢谢,尝试迁移到$q但无法使其工作(请参阅更新的问题)@nicco82,根据调用getCurrentLoc()的方式,您可能需要调用$apply(),因为resolve()的结果是异步传播的。有关更多信息,请参阅。