2013-07-03 123 views
0

我有這樣的代碼:AngularJs scope屬性,並承諾

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

在工作版本中你沒有做錯什麼。在非工作版本中,您將承諾視爲結果分配,但承諾不會如此 - 它們不會奇蹟般地變形爲承諾交付的結果。爲了在結果到達時處理結果,需要使用合適的回調調用promise的'.then()'方法。 –

回答

0

如果您使用Angular的$ q而不是Q,它應該工作:

​​

$ Q承諾通過在角模板引擎,這意味着在模板中,你可以把連接到一個範圍的承諾,如果他們得到的價值確認。 - $q docs

所以$scope.geocodedResult可以被設置爲$ Q承諾,並在承諾解決了,scope屬性會自動更新。

+0

謝謝,試圖遷移到$ q,但無法使其工作(請參閱更新後的問題) – nicco82

+0

@ nicco82,具體取決於調用getCurrentLoc()的方式,您可能需要調用$ apply(),因爲解析的結果)異步傳播。有關更多信息,請參閱http://stackoverflow.com/a/14762098/215945。 –