0

Вот моя функция-обертка (checkLocationPermission), чтобы проверить разрешения, прежде чем пытаться вызвать функцию (в данном случае geolocate()). Обертка используется для упрощения обработки ошибок.Wrapper для проверки разрешений

Проблема связана с функциями async, вызывающими друг друга, так как в Javascript это запрещено.

Как сделать такую ​​оболочку верным действующим обещанием от geolocate() или любой другой функцией, переданной как параметр?

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' будет Promise, возвращаемым' geolocate' (я предполагаю, что этот код находится внутри 'class') –

ответ

1

async функция возвращает Promise. Если вы явно создаете объект Promise в geolocate(), нет необходимости делать его async.

Не возвращать объекты Promise из async функции, если вы хотите отказаться от Promise, просто бросить ошибку:

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) => { 
    //... 
}); 
Смежные вопросы