0

関数を呼び出す前にアクセス許可を確認するラッパー関数(checkLocationPermission)はここにあります(この場合はgeolocate())。ラッパーは、エラー処理を単純化するために使用されます。ラッパーでアクセス許可を確認する

問題は、async関数が互いに呼び出すことです.Javascriptではそうではありません。

このようなラッパーをgeolocate()またはparamとして渡される他の関数から有効なPromiseを返すようにするにはどうすればよいですか?コールの

async geolocate() { 
    return new Promise((resolve, reject) => { 
    navigator.geolocation.getCurrentPosition(
     (position) => { 
     resolve(position); 
     }, 
     (err) => { 
     reject(err); 
     }, 
     {enableHighAccuracy: true, timeout: 30000, maximumAge: 3000} 
    ); 
    }); 

} 

async checkPermission(permission, fn) { 
    var status = await Permissions.getPermissionStatus(permission); 
    if (status!='authorized') { 
    Errors.permissionError(); 
    this.resetAfterError(); 
    return Promise.reject("PERMISSION ERROR"); 
    } 
    try { 
    return fn(); 
    } catch(err) { 
     Errors.internalError(err); 
     this.resetAfterError(); 
     return Promise.reject("ERROR OTHER"); 
    } 
} 

原産地:

var locationPromise = this.checkPermission('location',()=>this.geolocate()); 
+1

'それはJavascriptをのような問題は、お互いを呼び出す非同期機能でありますこれが何を意味するのか正確にはわからない。このコードでどんな問題がありますか? 'locationPromise'のようなものは' geolocate'によって返されたPromiseです(私はこのコードが 'class'の内部にあると仮定しています) –

答えて

1

async関数は約束を返します。 geolocate()でPromiseオブジェクトを明示的に作成する場合は、それをasyncにする必要はありません。

あなたが約束を拒否したい場合は、単にエラーをスローし、約束はasync関数からオブジェクトを返さない:

function geolocate() { 
    return new Promise((resolve, reject) => { 
    navigator.geolocation.getCurrentPosition(
     (position) => { 
     resolve(position); 
     }, 
     (err) => { 
     reject(err); 
     }, 
     {enableHighAccuracy: true, timeout: 30000, maximumAge: 3000} 
    ); 
    }); 
} 

async function checkPermission(permission, fn) { 
    var status = await Permissions.getPermissionStatus(permission); 
    if (status!='authorized') { 
    Errors.permissionError(); 
    this.resetAfterError(); 
    throw new Error("PERMISSION ERROR"); 
    } 
    try { 
    return fn(); 
    } catch(err) { 
    Errors.internalError(err); 
    this.resetAfterError(); 
    throw new Error("ERROR OTHER"); 
    } 
} 

checkPermission('location',()=>geolocate()).then((locationPromise) => { 
    //... 
}); 
関連する問題