返回未定义的简单JS函数



我正在处理一个React Native项目,我从一个简单的.js文件中导入了这个函数。我在React Native组件内部的一个状态上调用这些函数,并在一个按钮上用函数返回的内容更新该状态。

出于某种原因,它返回undefined,而不是我期望接收的true/false返回。


export const requestLocalizationPermissions = () => {
if (Platform.OS === 'ios') {
return true
}
PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,
{
title:
'Accept this',
buttonNeutral: '',
buttonNegative: 'Cancelar',
buttonPositive: 'OK',
},
)
.then(res => {
if (res === 'granted') {
PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title:
'Accept this',
buttonNeutral: '',
buttonNegative: 'Cancelar',
buttonPositive: 'OK',
},
)
.then(res => {
if (res === 'granted') {
console.log('sucess')
return true
} else if (res === 'never_ask_again') {
Alert.alert(
'Error',
texts.unblock_localization,
[
{
text: 'OK',
onPress: () => console.log('Login > Alert hidden'),
},
],
{ cancelable: false },
)
return false
}
})
.catch(err => {
console.log(err)
return false
})
} else if (res === 'never_ask_again') {
Alert.alert(
'Error',
texts.unblock_localization,
[{ text: 'OK', onPress: () => console.log('Login > Alert hidden') }],
{ cancelable: false },
)
return false
}
})
.catch(err => {
console.log(err)
return false
})
}

我确实会在控制台上打印成功消息,但当我记录调用的函数时,我确实会收到未定义的消息。

我建议您的一些反馈:

将这个函数封装在async函数的周围,类似于以下内容:

const requestCameraPermission = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
{
title: "Cool Photo App Camera Permission",
message:
"Cool Photo App needs access to your camera " +
"so you can take awesome pictures.",
buttonNeutral: "Ask Me Later",
buttonNegative: "Cancel",
buttonPositive: "OK"
}
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
console.log("You can use the camera");
} else {
console.log("Camera permission denied");
}
} catch (err) {
console.warn(err);
}
};

这段代码来自React Native文档。https://reactnative.dev/docs/permissionsandroid

这个函数PermissionsAndroid.request返回一个promise,也许这就是你收到这个undefined的原因。

您还需要返回它的结果。因此:

export const requestLocalizationPermissions = () => {
...
return PermissionsAndroid.request(...)
...
}

我认为你必须在那之后返回。像那样=>

return axios
.get(`${SERVER_API}/getChannel/${channel}`)
.then((resp) => {
return resp.data;
});

这里的问题是PermissionsAndroid.request是一个promise,您的函数调用不会等待它的响应返回到代码,您可以将其更改为以下内容:

export const requestLocalizationPermissions = async () => {
if (Platform.OS === 'ios') {
return true
}
try {
const permission = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION,
{
title: 'Accept this',
buttonNeutral: '',
buttonNegative: 'Cancelar',
buttonPositive: 'OK',
}
)
if (permission === 'granted') {
const permissionRes = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
{
title: 'Accept this',
buttonNeutral: '',
buttonNegative: 'Cancelar',
buttonPositive: 'OK',
}
)
if (permissionRes === 'granted') {
console.log('sucess')
return true
} else if (permissionRes === 'never_ask_again') {
Alert.alert(
'Error',
texts.unblock_localization,
[
{
text: 'OK',
onPress: () => console.log('Login > Alert hidden'),
},
],
{ cancelable: false }
)
return false
}
} else if (permission === 'never_ask_again') {
Alert.alert(
'Error',
texts.unblock_localization,
[{ text: 'OK', onPress: () => console.log('Login > Alert hidden') }],
{ cancelable: false }
)
return false
} else {
return false
}
} catch (err) {
console.log(err)
return false
}
}

请记住,您的功能现在是一个承诺,您需要等待响应。

最新更新