0

我有这个代码:

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 一起正常工作时永远不会被触发

4

1 回答 1

0

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

var dResult = $q.defer();

$q promises 被 Angular 模板引擎识别,这意味着在模板中,您可以将附加到范围的 Promise 视为结果值。-- $q 文档

所以$scope.geocodedResult可以设置为$q promise,当promise被解析时,scope属性会自动更新。

于 2013-07-03T15:40:11.610 回答