Angular 2 - 在继续之前等待承诺

时间:2017-03-10 14:46:54

标签: angular promise angular-promise

我需要创建一个地理位置变量并将值发送给API,但我很麻烦。

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已设置。

我做了一些谷歌搜索,但我得到了accros的承诺,但是我在编写语法时遇到了麻烦,我找不到任何有用的例子。

如何正确编写代码,以便在我的函数继续使用API​​之前必须先设置geoLoc?

2 个答案:

答案 0 :(得分: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...
    }
    );

答案 1 :(得分:1)

您可以将navigator.geolocation.getCurrentPosition调用转换为Promise:

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);
  }
);