2017-10-15 12 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'と私は新しいエラーをスロー ''追加削除簡略化のために私は...、それは今仕事を得るために管理します'abort promise chain'); 'if(!test)'ステートメントに入ります。私の約束のチェーンにエラーがある場合、私は最後のチェーンでそれを作成する代わりに、 'then(success、err)'のすべてに対してエラーハンドラを作成する必要はなく、 '.catch(間違っています。 –

+1

OK素晴らしい! https://github.com/petkaantonov/bluebird/issues/581 – Sampath

+0

ブルーバードのおかげで、約束を処理する方法が増えています。 –

関連する問題