#javascript #react-native #promise #geolocation
#javascript #react-native #обещание #геолокация
Вопрос:
Я пытаюсь создать вспомогательную функцию для получения текущего местоположения пользователя, но результат моего обещания не определен.
Эта функция работает, и я могу получить свои координаты :
//position.js
async function getCurrentPosition() {
return new Promise((resolve, reject) => {
Geolocation.getCurrentPosition(resolve, reject, {
enableHighAccuracy: true,
timeout: 15000,
maximumAge: 10000,
});
});
}
export async function getUserLocation() {
await request(
// Check for permissions
Platform.select({
android: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
}),
).then((res) => {
console.log('then');
// Permission OK
if (res === 'granted') {
console.log('granted');
return getCurrentPosition();
// Permission denied
} else {
console.log('Location is not enabled');
}
});
}
Но когда я вызываю свою функцию здесь, я получаю undefined :
import {getUserLocation} from '../../utils/position';
useEffect(() => {
getUserLocation()
.then((res) => console.log(res)) // { undefined }
.catch((err) => {
console.error(err.message);
});
}, []);
Что я делаю не так?
Комментарии:
1. Попробуйте сначала использовать строки типа «Разрешено» и «Отклонено», также добавьте свою геолокацию.getCurrentPosition внутри блока try и catch
2. Я попробовал то, что вы сказали, но все еще не определено, даже если я попытаюсь передать строки вместо position.coords
3. Какую платформу вы используете? А реальное устройство или симулятор? потому что ваш код работал с моим симулятором Android и возвращал местоположение.
4. Эмулятор IOS. Но я также могу получить местоположение в функции getCurrentPosition(), но когда я вызвал ее в своем use effect (в другом файле), я не могу получить значения разрешения. Там : .then((res) => console.log(res)) // { не определено }
5. Как написано,
getUserLocation()
не возвращает своеrequest(...).then()
обещание. Изменитеawait
наreturn
.
Ответ №1:
Как написано, getUserLocation() не возвращает свой запрос(…).then() promise . Измените await
на return
.
Кроме того, вам действительно следует перейти console.log('Location is not enabled')
на throw new Error('Location is not enabled')
, что позволит вызывающей стороне getUserLocation увидеть ошибку (в случае ее возникновения).
export async function getUserLocation() {
return request(Platform.select({ // Check for permissions
// ^^^^^^
'android': PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
'ios': PERMISSIONS.IOS.LOCATION_WHEN_IN_USE
}))
.then((res) => {
if (res === 'granted') { // Permission OK
return getCurrentPosition();
} else { // Permission denied
throw new Error('Location is not enabled'); // Throwing an Error here
// makes it available to the caller
// in its catch clause.
}
});
}