2013-09-22 23 views
2

我想創建一個使用谷歌地圖地理編碼器的角度服務,但是我發現從谷歌回調執行服務函數後執行。用谷歌地圖API服務回調函數創建角度服務

控制器
app.controller('AppCtrl',['geocoder',function AppCtrl (geocoder) { 
    var result=geocoder.geocode('greek'); 
    console.log(result); 
}); 

服務
app.service('geocoder',function() { 
      this.geocode=function(address) { 
        var geocoder = new google.maps.Geocoder(); 
        geocoder.geocode({ 'address': address}, function(results, status) { 
          if (status == google.maps.GeocoderStatus.OK) { 
            console.log(results); 
            return results; 
          } else { 
            return ('Geocode was not successful for the following reason: ' + status); 
          } 
        }); 
      }; 
    }); 

的問題是,在服務未定義的控制器輸出和所述的console.log(結果)的console.log(結果)得到的結果在函數調用之後從谷歌回來。也就是說,回調函數沒有及時返回結果。

有沒有辦法解決這個問題? 謝謝。

+0

羅蘭和Chandermani回答我的問題。正如Chandermani的回答提供了兩種方法,它被接受。謝謝大家 – Chung

回答

1

由於Chandermani指出的那樣,你需要提供你的方法有一個回調:

app.service('geocoder',function() { 
      this.geocode=function(address, outerCallback) { 
        var geocoder = new google.maps.Geocoder(); 
        geocoder.geocode({ 'address': address}, function(results, status) { 
          console.log(results); 
          if (status == google.maps.GeocoderStatus.OK) { 
            outerCallback({success: true, err: null, results: results}); 
          } else { 
            outerCallback({success:false, err: new Error('Geocode was not successful for the following reason: ' + status), results: null}); 
          } 
        }); 
      }; 
    }); 

在你的控制器:

app.controller('AppCtrl',['geocoder',function AppCtrl (geocoder) { 
    var result=geocoder.geocode('greek', function(callbackResult) { 
     console.log(callbackResult); //{success: true, err: undefined, results: {...} or {success:false, err: Error object, results: undefined} 
    }); 

}); 

如果這樣工作,那麼你很好地重構代碼以使用promise

希望這有助於

R.