2017-10-15 54 views
1

我在Ionic 3中编写了一个函数来获取用户的位置并使用用户的经度和纬度获取其地址。该功能还会检查用户的位置设置是否启用,如果不启用,则会调用this.diagnostic.switchToLocationSettings()它基本显示用户打开的位置设置。我还添加了this.diagnostic.registerLocationStateChangeHandler方法来检查用户是否实际开启了我之前显示的位置设置中的位置。如果一切正常,我会继续运行其他流程,例如获取地理位置并翻译成地址。Ionic 3无法在回调函数中拒绝承诺

下面是我的完整代码:

getMyLocation() { 
    this.geoOptions = { 
     enableHighAccuracy: false 
    } 
    const loadingMsg = this.loadingCtrl.create({ 
     content: "Getting your location..." 
    }) 

    loadingMsg.present(); 



    this.diagnostic.isLocationEnabled().then(test => { 
     this.diagnostic.registerLocationStateChangeHandler((state)=>{ 
     if((this.platform.is('ios')) && (state !== this.diagnostic.permissionStatus.GRANTED || 
      state !== this.diagnostic.permissionStatus.GRANTED_WHEN_IN_USE) || 
      (this.platform.is('android')) && (state === this.diagnostic.locationMode.LOCATION_OFF)){ 
      return Promise.reject("Please switch on your location"); 
      } 
     }) 
     if (!test) { 
     this.diagnostic.switchToLocationSettings() 
     } 

     // return this.geolocation.getCurrentPosition(this.geoOptions) 
     return this.geolocation.getCurrentPosition(this.geoOptions) 
     // console.log("Error! Please switch on your location"); 
     // return Promise.reject("Error! Please switch on your location"); 
    },(err:any)=>{ 
     loadingMsg.dismiss(); 
     console.log("error : " + err); 

    }).then((pos: Geoposition) =>{ 

     return this.nativeGeocoder.reverseGeocode(pos.coords.latitude, pos.coords.longitude); 

    },(err: PositionError)=>{ 
     loadingMsg.dismiss(); 
     console.log("error : " + err.message); 
     return Promise.reject(err.message); 

    }).then((result: NativeGeocoderReverseResult) =>{ 

     this.currentAddress = result.locality+", "+result.countryName; 
     loadingMsg.dismiss(); 

    },(err:any)=>{ 

     console.log("error : " + err); 
     loadingMsg.dismiss(); 
     return Promise.reject(err); 

    }) 
    } 

的问题是我无法停止的承诺链接如果this.diagnostic.switchToLocationSettings()被触发后,用户没有开启。我试图停止链接的地方在this.diagnostic.registerLocationStateChangeHandler回调函数内。我是一个承诺链接方法的初学者。

回答

0

你可以这样说:

您可以在您需要abort promise chain的地方使用throw new Error('abort promise chain');return null;

this.diagnostic.isLocationEnabled().then(test => { 
     this.diagnostic.registerLocationStateChangeHandler((state)=>{ 
     if((this.platform.is('ios')) && (state !== this.diagnostic.permissionStatus.GRANTED || 
      state !== this.diagnostic.permissionStatus.GRANTED_WHEN_IN_USE) || 
      (this.platform.is('android')) && (state === this.diagnostic.locationMode.LOCATION_OFF)){ 
      throw new Error('abort promise chain');//here 
      return null; 
      } 
     }) 
+1

谢谢!我设法得到它现在的工作,虽然有几个问题我在我的代码中发现的...所以为了简单起见,我删除'this.diagnostic.registerLocationStateChangeHandler',我接着说:抛出新的错误( '放弃诺言链');'进入'if(!test)'语句。然后我发现,如果我的承诺链中有错误,我不必为所有'then(success,err)'创建错误处理程序,而只是在最后一个链上创建它或将'.catch( err)'。 –

+1

好极了!在这里你可以找到更多的选择:https://github.com/petkaantonov/bluebird/issues/581 – Sampath

+0

我看到有更多的方式来处理使用蓝鸟的承诺,谢谢! –