На ваш вопрос есть две части
1. Сделайте так, чтобы эта функция была ожидаемой.
Это ответственно, предоставляя вам логику того, как это сделать. Awaitable - это не что иное, как асинхронная функция или что-то, что возвращает обещание. Если вы хотите пойти по пути async
, вам нужно сначала создать версию getCurrentPosition
, которая возвращает обещание. Это можно сделать, как показано ниже
function getCurrentLocation(options) {
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(resolve, ({code, message}) =>
reject(Object.assign(new Error(message), {name: "PositionError", code})),
options);
});
};
PS: кредиты на https://stackoverflow.com/a/44439358/2830850 для вышеуказанного кода
Теперь вы можете переписать свой код, как показано ниже
async function getUserLocation() {
let response = await Permissions.check('location')
let options = Platform.OS === 'android' ? null : {enableHighAccuracy: true, timeout: 100000, maximumAge: 1000}
if (response == 'authorized') {
return await getCurrentLocation(options)
}
return null;
}
В случае, если вы не хотите идти promise
, как это было бы ниже
function getUserLocation() {
return new Promise((resolve, reject) => {
Permissions.check('location')
.then(response => {
if (response == 'authorized') {
navigator.geolocation.getCurrentPosition(
(location) => {
resolve({
latitude: location.coords.latitude,
longitude: location.coords.longitude
});
},
(error) => {
reject(error);
},
Platform.OS === 'android' ? null : { enableHighAccuracy: true, timeout: 100000, maximumAge: 1000 }
);
} else {
resolve(null);
}
})
});
}
Одна ключевая вещь здесь, в отличие от обратных вызовов, обещает разрешить одно значение, что означает, что вам нужно использовать объекты для возврата нескольких параметров.
2. Как другие работают так (для обеих ОС) и работают на 100% одинаково.
Здесь ваш вопрос становится самоуверенным, я могу использовать другой подход, вы можете сделать что-то другое, а другой человек может сделать что-то другое. Но я все еще буду обсуждать несколько возможностей.
Разделить на несколько функций
function getUserLocation() {
if (Platform.OS === 'android')
{
return getUserLocationAndroid();
} else {
return getUserLocationIOS();
}
}
Ведение пар ключ-значение
У вас может быть код, который автоматически связывает функцию в зависимости от ОС.
Utils = {
getFunction(name) {
if ((name + Platform.OS) in this)
return this[name + Platform.OS]
return this[name];
}
getLocation: function() {}
//getLocationandroid: function() {}
}
Таким образом, по умолчанию у вас будет getLocation
для сервера обеих ОС, но в случае слишком большого отклонения кода одной из ОС вы создадите новую функцию для той же самой. Код будет выглядеть примерно так:
Utils.getFunction("getLocation")(...)
Одна функция с разветвлением
Это ваш нынешний подход. Я бы придерживался этого, пока функции легко понять, и есть четкое намерение, какая часть кода выполняет специфические для платформы вещи
Опять-таки, здесь можно указать еще 10 различных способов, но в конечном итоге это будет зависеть от одного: что вам легче поддерживать, понимать использование. Некоторые подходы также зависят от конкретного случая, где вы можете смешать несколько подходов на основе варианта использования