2017-03-10 60 views
3

我需要創建一個地理位置變量並將值發送到API,但我很麻煩。Angular 2 - 在繼續之前等待承諾

public virtualRegistrationHandler(e: any): void { 
    e.preventDefault(); 
    console.log("loop"); 
    if (navigator.geolocation) { 
     let geoLoc = navigator.geolocation.getCurrentPosition(this.setGeoLoc); 

     this.VirtualRegistrationService.virtualRegistration(geoLoc) 
      .subscribe(
      response => this.toastyCommunicationService.addSuccesResponseToast(response), 
      error => this.toastyCommunicationService.addErrorResponseToast(error) 
      ); 
    } else { 
     this.toastyCommunicationService.addErrorResponseToast("Geolocation is not supported by this browser."); 
    } 
} 

private setGeoLoc(position: any) { 
    console.log("Latitude " + position.coords.latitude, "Longitude " + position.coords.longitude); 
    let geoLoc = { "Latitude": position.coords.latitude, "Longitude": position.coords.longitude }; 
    return geoLoc; 
} 

這是我當前的代碼,但它不會等待geoLoc退換,所以現在它發送一個不確定的參數給API。

我想API調用等待直到geoloc被設置。

我做了一些Google搜索,我來了accros的承諾,但是我在編寫語法時遇到了麻煩,我找不到任何工作示例。

如何正確編寫我的代碼,以便geoLoc在我的函數繼續到API之前必須先設置?

回答

2

根據this,getCurrentPosition方法返回一個promise,所以你只需要訂閱它。

喜歡的東西:

navigator.geolocation.getCurrentPosition(
    pos=>{ 
    var crd = pos.coords; 

    console.log('Your current position is:'); 
    console.log(`Latitude : ${crd.latitude}`); 
    console.log(`Longitude: ${crd.longitude}`); 
    console.log(`More or less ${crd.accuracy} meters.`); 
    }, 
    onError=>{ 
    ...Catch errors... 
    } 
    ); 
+0

我認爲你是在正確的軌道上,但是' 「縱橫」:position.coords.latitude'它說它不知道'位置'是什麼,那麼我如何得到這個值呢? – Nicolas

+0

resove函數應該包含一個位置類型的對象(https://developer.mozilla.org/en-US/docs/Web/API/Position)。 Iv'e編輯了我的答案,以便更清楚 –

1

您可以轉換navigator.geolocation.getCurrentPosition調用承諾:

const whenPositionGet = new Promise((resolve, reject) => navigator.geolocation.getCurrentPosition(resolve, reject)); 
whenPositionGet.then(
    (position: Position) => { 
     console.log("Latitude " + position.coords.latitude, "Longitude " + position.coords.longitude); 
    }, 
    (error: PositionError) => { 
     console.error(error); 
    } 
);