【发布时间】:2020-11-15 02:44:51
【问题描述】:
我是 JavaScript 的新手,目前在 React Native 中使用 async/await。我有两个异步函数getAsyncLocation 和getParking。 getAsyncLocation 从设备以及路由参数(从另一个屏幕路由时获得)获取位置。 getParking 使用状态 - mapRegion - 由 getAsyncLocation 分配来查找相关结果。
但是,当我一个接一个地运行它们时,我得到了:-
[Unhandled promise rejection: TypeError: null is not an object (evaluating 'mapRegion.latitude')]
我有以下代码:-
const [mapRegion, setmapRegion] = useState(null);
handleMapRegionChange = (mapRegion) => setmapRegion({ mapRegion });
const handleCenterChange = (lat, lng) => setmapRegion({
latitude: lat,
longitude: lng,
latitudeDelta: 0.0922,
longitudeDelta: 0.0421,
})
async function getAsyncLocation() {
if (route.params) { // obtained from some other screen
handleCenterChange(route.params.lat, route.params.lng);
console.log("route params for location ", mapRegion.latitude, mapRegion.longitude);
}
else {
const { status, permissions } = await Permissions.askAsync(
Permissions.LOCATION
);
if (status === "granted") {
sethasLocationPermission(true);
let location = await Location.getCurrentPositionAsync({});
setlocationResult(JSON.stringify(location));
handleCenterChange(location.coords.latitude, location.coords.longitude);
} else {
alert("Location permission denied");
}
}
}
async function getParkings() {
console.log("get parking runing")
console.log("get parkig ", mapRegion.latitude, ", ", mapRegion.longitude);
await axios.get(`http://${MyIp}:8080/booking/findParking`, {
params: {
lat: mapRegion.latitude,
lng: mapRegion.longitude,
rad: 10
},
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
})
.then((response) => {
let parkingSpace = response.data;
let parking = []
for (let i = 0; i < parkingSpace.length; i++) {
parking.push({
spaceId: parkingSpace[i]._id,
ownerId: parkingSpace[i].owner,
location:
{ latitude: parkingSpace[i].latitude, longitude: parkingSpace[i].longitude }
})
}
console.log(parking)
setSpace(parking);
})
.catch((err) => {
console.log(err)
})
}
async function getData() {
await getAsyncLocation();
await getParkings();
}
useEffect(() => {
getData();
}, []);
我曾尝试在各种博客和 stackoverflow 问题中搜索它,但无法解决。任何提示将不胜感激。
【问题讨论】:
-
一个异步函数只能等待一个promise,所以为了在getData()中使用await关键字和await getAsyncLocation()和await getParkings(),确保这些函数确实返回一个承诺。例如,返回 axios.get(...)。
-
同意@RicardoAgra
标签: javascript react-native async-await