2013-07-03 5 views
0

У меня есть этот код: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(); 
}); 

Что я делаю неправильно?

UPDATE:

Я сейчас пытаюсь использовать только $ 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

Пожалуйста, добавьте ко всему соответствующему коду вопроса. Держитесь подальше от внешних ссылок, когда это не нужно. – Stewie

+0

В рабочей версии вы ничего не делаете неправильно. В нерабочей версии вы назначаете обещание так, как если бы это было результатом, но обещания не работают так - они не волшебным образом преобразуются в результат, который они обещают доставить. Чтобы работать с результатом, когда он прибывает, необходимо вызвать метод '.then()' для обещания с подходящим обратным вызовом. –

ответ

0

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

var dResult = $q.defer(); 

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

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

+0

Спасибо, попытался перейти на $ q, но не могу заставить его работать (см. Обновленный вопрос) – nicco82

+0

@ nicco82, в зависимости от того, как вызывается getCurrentLoc(), вам может потребоваться вызвать $ apply(), потому что результаты решения () распространяются асинхронно. См. Http://stackoverflow.com/a/14762098/215945 для получения дополнительной информации. –

Смежные вопросы