daw*_*777 0 async-await reactjs react-hooks
我需要做什么才能等到doSomethingWithItems()完成后fetchItems()?
const [items, setItems] = useState();
const fetchItems = async () => {
try {
let responseData = await sendRequest(`${process.env.REACT_APP_BACKEND_URL}/items/user/${userId}`);
setItems(responseData.items);
} catch (err) {}
};
const doSomethingWithItems = () => {
const filteredItems = items.filter(x => x.title === 'something');
setItems(filteredItems);
}
useEffect(() => {
fetchItems(); // ** WAIT FOR THIS TO FINISH BEFORE MOVING ON **
doSomethingWithItems();
}, []);
Run Code Online (Sandbox Code Playgroud)
由于fetchItems是async,因此它返回 a Promise。您可以遵循.then():
useEffect(() => {
fetchItems().then(doSomethingWithItems);
}, []);
Run Code Online (Sandbox Code Playgroud)
或者,更扩展的语法以更好地理解结构:
useEffect(() => {
fetchItems().then(() => {
doSomethingWithItems();
});
}, []);
Run Code Online (Sandbox Code Playgroud)
然而,您的下一个问题是跟踪状态。请注意,这doSomethingWithItems取决于items. 但状态不会立即更新。不更新 中的状态fetchItems,而是返回新值并将其传递给doSomethingWithItems:
const [items, setItems] = useState();
const fetchItems = async () => {
try {
let responseData = await sendRequest(`${process.env.REACT_APP_BACKEND_URL}/items/user/${userId}`);
return responseData.items;
} catch (err) {
// You probably want to do something meaningful here
// At least return something:
return [];
}
};
const doSomethingWithItems = (newItems) => {
const filteredItems = newItems.filter(x => x.title === 'something');
setItems(filteredItems);
}
useEffect(() => {
fetchItems().then(newItems => {
doSomethingWithItems(newItems);
});
}, []);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |