异步函数未在android上返回
Posted
技术标签:
【中文标题】异步函数未在android上返回【英文标题】:Async function not returning on android 【发布时间】:2018-10-17 19:04:45 【问题描述】:我遇到了一个异步函数的问题,它在 android 上运行时没有返回,而在 ios 上运行时却正常返回。
这是函数:
_getLocationAsync = async () =>
let status = await Permissions.askAsync(Permissions.LOCATION);
if (status !== 'granted')
this.setState(
errorMessage: 'Permission to access location was denied',
);
let location = await Location.getCurrentPositionAsync();
this.setState(location);
return location;
;
我在这里的另一个函数中使用它:
async fetchMarkers(settings )
console.log("fetchMarkers");
// console.log(settings);
this.setState(listLoading: true);
let location = await this._getLocationAsync();
console.log("location is ", location);
....
....
此行在 android 中没有返回,但在 ios 中返回。在 android 中,我尝试在 _getLocationAsync 中返回它之前记录位置的值,它记录了一个已定义且正确的对象,我想知道为什么它没有返回它:
let location = await Location.getCurrentPositionAsync();
我正在使用 React Native 0.53
【问题讨论】:
与您的问题无关,但是您是否意识到如果未授予状态,您仍然会尝试 getCurrentPositionAsync? 好收获!我也会解决这个问题 奇怪的是它会在 iOS 设备上返回,而不是在 Android 设备上。但是,既然您是在成功获取后设置位置状态,为什么不通过状态访问它呢?await Location.getCurrentPositionAsync(); let location = this.state.location
@K.Wu 我的理由是,由于 setState 是异步的,我不能保证在我尝试在第二个函数中访问它之前会设置该位置,但如果我等待结果,我可以保证返回的值是最新的
@A.Wali 那么你也可以在await this.setState( location )
_getLocationAsync
函数中使用
【参考方案1】:
我认为 Android 无法获取位置信息有一些原因。
我正在使用这个位置选项,嗯 在安卓上运行良好
// how accuracy should get location be
const GET_LOCATION_OPTIONS =
enableHighAccuracy: false,
timeout: 20000,
maximumAge: 1000,
;
navigator.geolocation.getCurrentPosition(
(position) =>
const location =
latitude: position.coords.latitude,
longitude: position.coords.longitude,
;
if (callback) callback(location);
,
(err) =>
if (callback) callback(null);
,
GET_LOCATION_OPTIONS,
);
参考:https://facebook.github.io/react-native/docs/geolocation.html
【讨论】:
【参考方案2】:可能是权限问题, 检查应用是否确实应用了职位许可
【讨论】:
以上是关于异步函数未在android上返回的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
Kotlin 协程Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )