React-native:避免使每个经过身份验证的远程调用异步
React-native: avoid making every authenticated remote call async
我有一个 React Native 项目,它依赖于在对我的后端进行经过身份验证的调用时从 SecureStorage 获取凭据。与正常的反应不同,这是一个异步过程,这意味着我每次需要 headers 时都必须处理承诺。由于我每次都需要阻止获取凭据,但是 shoudln't/can't force async to sync,这意味着很多不必要的代码(链接 'thens' 或进行远程调用 async/await)。有没有更优雅的方式来处理这种情况?
我能想到的两个选项是 1.) 每次都处理 promises 或 2.) 使用全局上下文传入 auth headers。
这是我的例子
useFeedFetch = (payload: GetItemsRequest) => {
// misc state set here
useEffect(() => {
const getFeedAsync = async () => {
// gets credentials from secure storage
let headers = await AuthService.getAuthHeader()
axios({
method: 'POST',
url: requestUrl,
headers: headers,
data: payload,
}).then((res) => {
...
}
}
getFeedAsync()
}
, [payload.page]);
return {
loading, error, items, hasMore,
};
您当然可以使用 Axios interceptor
使其更加隐蔽
// eg api.js
import axios from "axios"
import AuthService from "wherever"
// create a new instance to include your interceptor
export const api = axios.create({
// baseURL can be handy to shorten your URLs
})
api.interceptors.request.use(async config => ({
...config,
headers: {
...config.headers,
...await AuthService.getAuthHeader()
}
}))
现在您可以使用 api
代替 axios
,它会在每个请求上自动应用您的身份验证 headers
我有一个 React Native 项目,它依赖于在对我的后端进行经过身份验证的调用时从 SecureStorage 获取凭据。与正常的反应不同,这是一个异步过程,这意味着我每次需要 headers 时都必须处理承诺。由于我每次都需要阻止获取凭据,但是 shoudln't/can't force async to sync,这意味着很多不必要的代码(链接 'thens' 或进行远程调用 async/await)。有没有更优雅的方式来处理这种情况?
我能想到的两个选项是 1.) 每次都处理 promises 或 2.) 使用全局上下文传入 auth headers。
这是我的例子
useFeedFetch = (payload: GetItemsRequest) => {
// misc state set here
useEffect(() => {
const getFeedAsync = async () => {
// gets credentials from secure storage
let headers = await AuthService.getAuthHeader()
axios({
method: 'POST',
url: requestUrl,
headers: headers,
data: payload,
}).then((res) => {
...
}
}
getFeedAsync()
}
, [payload.page]);
return {
loading, error, items, hasMore,
};
您当然可以使用 Axios interceptor
使其更加隐蔽// eg api.js
import axios from "axios"
import AuthService from "wherever"
// create a new instance to include your interceptor
export const api = axios.create({
// baseURL can be handy to shorten your URLs
})
api.interceptors.request.use(async config => ({
...config,
headers: {
...config.headers,
...await AuthService.getAuthHeader()
}
}))
现在您可以使用 api
代替 axios
,它会在每个请求上自动应用您的身份验证 headers