使用.then()

时间:2018-04-06 15:25:22

标签: typescript

抱歉,我不知道如何以更好的方式写标题。

我目前有一个带有此功能的打字稿文件:

getCurrentPosition(){
    this.geolocation.getCurrentPosition().then((resp) => {
        this.lat = Math.random()*10;
        this.lng = resp.coords.longitude;
        return {lat: this.lat, lng: this.lng}
      }).catch((error) => {
        console.log('Error getting location', error);
      });
    //   return {lat: this.lat, lng: this.lng}
}

如果我调用getCurrentPosition(),我会收到一个未定义的值。 如果我在一段时间后第二次尝试调用它,它会返回一个值(这是之前计算的值)

如何在返回任何值之前等待地理位置的响应?

抱歉这个愚蠢的问题,但我已经花了很多时间来解决这个问题!

2 个答案:

答案 0 :(得分:1)

如果你正在使用TypeScript(我假设你提到了Ionic),你可以这样做:

async getCurrentPosition(){
    const resp = await this.geolocation.getCurrentPosition()
    this.lat = Math.random()*10;
    this.lng = resp.coords.longitude;
    return {lat: this.lat, lng: this.lng}
}

我建议您使用async/awaittutorial)来简化基于Promise的异步代码。

代码段返回一个解析为{lat: this.lat, lng: this.lng}的Promise。通过使用await getCurrentPosition()调用该函数,它将自动解析承诺的值。

一旦你得到这个想法,它可能会有点混乱,它很棒(检查教程链接)。

答案 1 :(得分:0)

您遇到的问题是因为getCurrentPosition()正在异步评估this.geolocation.getCurrentPosition方法,因此return语句只是立即执行并返回一个lat和{{}的对象1}}在其中未定义(如果执行注释掉的代码)。

您要做的是返回lng而不是简单地执行它并在您的班级上设置属性。

this.geolocation.getCurrentPosition()

然后您可以按如下方式执行:

getCurrentPosition(){
    return this.geolocation.getCurrentPosition().then(resp => {
        const lat = Math.random()*10;
        const lng = resp.coords.longitude;
        return {lat: lat, lng: lng}
      }).catch(err => {
        console.log('Error getting location', error);
      });
}

我希望有所帮助!