2016-07-31 88 views
1

我的Angular工廠保持返回未定義狀態,下面是我正在嘗試的兩個代碼段。Angular factory keep undefined

這是我geoLocationService.js

myApp.factory('geoLocationService', function() { 

return { 
    getMyGeolocation: function () { 

     var options = { 
      enableHighAccuracy: true, 
      timeout: 5000, 
      maximumAge: 0 }; 

     var x = navigator.geolocation.getCurrentPosition(function success(pos) { 
      return pos.coords; 
     }, function error(err) { 
      console.log(err); 
     }, options); 
    } 
} 
}); 

,這是我controller.js

myApp.controller('homeCtrl', function($scope, geoLocationService){ 

$scope.shareThePost = function(){ 
    geoLocationService.getMyGeolocation().then(function(data){ 
     console.log(data) 
    }); 
} 
}); 
+0

你能告訴確切的錯誤在您的控制檯? – AranS

+0

類型錯誤:無法讀取屬性「然後」未定義 –

+0

我張貼的答案,請嘗試 –

回答

0

你沒有兌現承諾。每個.then()都依賴於返回的承諾。

地址:

return x; 

getMyGeolocation功能的結束。更棒的是,因爲你沒有使用x其他地方 - 你可以返回直線距離:

return navigator.geolocation.getCurrentPosition(....) 

編輯:看起來像getCurrentPosition不返回一個承諾,所以你不能鏈.then()上它。相反,你需要用自己的承諾來包裝它來達到你想要什麼:

myApp.factory('geoLocationService', function ($q) { 

return { 
    getMyGeolocation: function () { 

     var deferred = $q.defer(); 

     var options = { 
      enableHighAccuracy: true, 
      timeout: 5000, 
      maximumAge: 0 }; 

     navigator.geolocation.getCurrentPosition(function success(pos) { 
      deferred.resolve(pos.coords); 
     }, function error(err) { 
      console.log(err); 
      deferred.reject(err); 
     }, options); 

     return deferred.promise; 
    } 
} 
}); 
+0

顯示仍然沒有工作,同樣的錯誤保持在控制檯 –

+0

shwoin了@AmmarAlnaimat見編輯。 –

+0

thanx man ,, that wotk for my ,, thanx很多:) :) –

0

因爲getMyGeolocation()從工廠函數沒有返回任何東西。您必須添加

return x; 

from function。因爲你的承諾是將數據返回工廠但是你的工廠沒有將數據返回給控制器。

+0

我不行,同樣的錯誤保持在控制檯 –

0
myApp.factory('geoLocationService', function() { 
    return { 
     getMyGeolocation: function() { 
      return new Promise((resolve, reject) => { 
       var options = { 
        enableHighAccuracy: true, 
        timeout: 5000, 
        maximumAge: 0 }; 

       navigator.geolocation.getCurrentPosition(
        pos => resolve(pos.coords), 
        err => reject(err), 
        options 
       ); 
      }; 
     }, 
    }; 
});