Атрибуты области действия и обещания AngularJs

У меня есть этот код:

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


person nicco82    schedule 03.07.2013    source источник
comment
Пожалуйста, добавьте весь соответствующий код в вопрос. Держитесь подальше от внешних ссылок, когда в этом нет необходимости.   -  person Stewie    schedule 03.07.2013
comment
В рабочей версии вы ничего плохого не делаете. В нерабочей версии вы присваиваете промис, как если бы это был результат, но промисы так не работают — они не превращаются волшебным образом в результат, который обещают предоставить. Чтобы работать с результатом, когда он будет получен, необходимо вызвать метод обещания .then() с подходящим обратным вызовом.   -  person Beetroot-Beetroot    schedule 03.07.2013


Ответы (1)


Если вы используете Angular $q вместо Q, это должно работать:

var dResult = $q.defer();

Промисы $q распознаются механизмом шаблонов в angular, что означает, что в шаблонах вы можете обрабатывать промисы, прикрепленные к области, как если бы они были результирующими значениями. -- $q документов

Таким образом, $scope.geocodedResult можно установить на обещание $q, и когда обещание будет разрешено, свойство области автоматически обновится.

person Mark Rajcok    schedule 03.07.2013
comment
Спасибо, пытался перейти на $q, но не смог заставить его работать (см. обновленный вопрос) - person nicco82; 04.07.2013
comment
@nicco82, в зависимости от того, как вызывается getCurrentLoc(), вам может потребоваться вызвать $apply(), поскольку результаты resolve() распространяются асинхронно. См. stackoverflow.com/a/14762098/215945 для получения дополнительной информации. - person Mark Rajcok; 04.07.2013