2017-03-10 73 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); 
    } 
);