React Native 同时获取多个 API 通常涉及到并发请求的概念。你可以使用多种方法来实现这一目标,以下是一些常见的方法:
Promise.all
Promise.all
可以并行执行多个异步操作,并在所有操作都完成后返回结果。
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native';
const fetchMultipleAPIs = async () => {
const [data, setData] = useState([]);
try {
const api1 = fetch('https://api.example.com/data1');
const api2 = fetch('https://api.example.com/data2');
const api3 = fetch('https://api.example.com/data3');
const [response1, response2, response3] = await Promise.all([api1, api2, api3]);
const json1 = await response1.json();
const json2 = await response2.json();
const json3 = await response3.json();
setData([json1, json2, json3]);
} catch (error) {
console.error('Error fetching data: ', error);
}
};
const App = () => {
useEffect(() => {
fetchMultipleAPIs();
}, []);
return (
<View>
{data.map((item, index) => (
<Text key={index}>{JSON.stringify(item)}</Text>
))}
</View>
);
};
export default App;
async/await
和 for
循环如果你有多个 API 需要按顺序获取,可以使用 async/await
和 for
循环。
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native';
const fetchMultipleAPIsSequentially = async () => {
const [data, setData] = useState([]);
try {
const urls = [
'https://api.example.com/data1',
'https://api.example.com/data2',
'https://api.example.com/data3',
];
for (const url of urls) {
const response = await fetch(url);
const json = await response.json();
setData(prevData => [...prevData, json]);
}
} catch (error) {
console.error('Error fetching data: ', error);
}
};
const App = () => {
useEffect(() => {
fetchMultipleAPIsSequentially();
}, []);
return (
<View>
{data.map((item, index) => (
<Text key={index}>{JSON.stringify(item)}</Text>
))}
</View>
);
};
export default App;
你也可以使用一些第三方库来简化并发请求的处理,例如 axios
。
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native';
import axios from 'axios';
const fetchMultipleAPIsWithAxios = async () => {
const [data, setData] = useState([]);
try {
const urls = [
'https://api.example.com/data1',
'https://api.example.com/data2',
'https://api.example.com/data3',
];
const responses = await Promise.all(urls.map(url => axios.get(url)));
const jsonData = responses.map(response => response.data);
setData(jsonData);
} catch (error) {
console.error('Error fetching data: ', error);
}
};
const App = () => {
useEffect(() => {
fetchMultipleAPIsWithAxios();
}, []);
return (
<View>
{data.map((item, index) => (
<Text key={index}>{JSON.stringify(item)}</Text>
))}
</View>
);
};
export default App;
Promise.race
结合 setTimeout
来设置超时。const fetchWithTimeout = (url, options, timeout = 5000) => {
return Promise.race([
fetch(url, options),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Request timed out')), timeout)
),
]);
};
Promise.allSettled
来捕获所有请求的状态,而不仅仅是成功的请求。const results = await Promise.allSettled([api1, api2, api3]);
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log(result.value);
} else {
console.error(result.reason);
}
});
通过以上方法,你可以有效地在 React Native 中同时获取多个 API 的数据,并处理可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云