Async/Await 函数被调用两次
Async/Await function gets called twice
我制作了一个简单的 Async 函数并想在我的 React 应用程序中对其进行测试 运行。函数为:
async function WAIT(time: any) {
await new Promise((r) => setTimeout(r, time))
}
export async function GetMemberList(orgId: string):Promise<ResponseInterface>{
await WAIT(3000);
return {code: 404, data: "Data"}
}
我尝试在我的主应用程序中这样调用它:
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
fn();
return (<div>.....<div>)
}
但是问题是console.log(x)
运行s 两次。我得到 {code: 404, data: "Data"} 两次。这是为什么?谢谢
我试过运行你的代码,它输出了一次。
问题很可能是在您的模板中触发了重新渲染,并且 fn()
再次被调用。
您可以通过将 fn()
包裹在 useEffect()
中轻松验证它。
解决方法如下:
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
React.useEffect(() => {
fn();
}, []);
return (<div>.....<div>)
}
使用 useEffect
和一个空的依赖数组将使 fn()
只在 App
组件安装时被调用一次。
通过直接在您的组件中调用 fn() ,它会在您的组件每次渲染时触发。发生这种情况的原因有很多。
你可以通过useEffect来避免这种情况,并指定函数的依赖关系。在这种情况下,它只是函数本身。
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
useEffect(() => {
fn();
}, [fn]);
return (<div>.....<div>)
但是,由于每次组件渲染时都会重新定义 fn,因此每次都会调用它。
在这种特定情况下,您应该在组件外部定义函数。它不依赖于组件提供的任何数据,所以它基本上是一个静态函数。它永远不会改变。在这种情况下,您可以安全地从依赖数组
中删除 fn
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
function App() {
useEffect(() => {
fn();
}, []);
return (<div>.....<div>)
还有其他方法可以做到这一点。可以在useEffect里面定义fn函数,也可以用useCallback来定义,这样render之间会有稳定的引用
function App() {
useEffect(() => {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
fn();
}, []);
return (<div>.....<div>)
使用回调:
function App() {
const cb = useCallback(async() => {
let x = await GetMemberList('SOme');
console.log(x);
}, []);
useEffect(() => {
cb();
}, [cb]);
return (<div>.....<div>)
我制作了一个简单的 Async 函数并想在我的 React 应用程序中对其进行测试 运行。函数为:
async function WAIT(time: any) {
await new Promise((r) => setTimeout(r, time))
}
export async function GetMemberList(orgId: string):Promise<ResponseInterface>{
await WAIT(3000);
return {code: 404, data: "Data"}
}
我尝试在我的主应用程序中这样调用它:
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
fn();
return (<div>.....<div>)
}
但是问题是console.log(x)
运行s 两次。我得到 {code: 404, data: "Data"} 两次。这是为什么?谢谢
我试过运行你的代码,它输出了一次。
问题很可能是在您的模板中触发了重新渲染,并且 fn()
再次被调用。
您可以通过将 fn()
包裹在 useEffect()
中轻松验证它。
解决方法如下:
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
React.useEffect(() => {
fn();
}, []);
return (<div>.....<div>)
}
使用 useEffect
和一个空的依赖数组将使 fn()
只在 App
组件安装时被调用一次。
通过直接在您的组件中调用 fn() ,它会在您的组件每次渲染时触发。发生这种情况的原因有很多。
你可以通过useEffect来避免这种情况,并指定函数的依赖关系。在这种情况下,它只是函数本身。
function App() {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
useEffect(() => {
fn();
}, [fn]);
return (<div>.....<div>)
但是,由于每次组件渲染时都会重新定义 fn,因此每次都会调用它。
在这种特定情况下,您应该在组件外部定义函数。它不依赖于组件提供的任何数据,所以它基本上是一个静态函数。它永远不会改变。在这种情况下,您可以安全地从依赖数组
中删除 fnasync function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
function App() {
useEffect(() => {
fn();
}, []);
return (<div>.....<div>)
还有其他方法可以做到这一点。可以在useEffect里面定义fn函数,也可以用useCallback来定义,这样render之间会有稳定的引用
function App() {
useEffect(() => {
async function fn() {
let x = await GetMemberList('SOme');
console.log(x);
}
fn();
}, []);
return (<div>.....<div>)
使用回调:
function App() {
const cb = useCallback(async() => {
let x = await GetMemberList('SOme');
console.log(x);
}, []);
useEffect(() => {
cb();
}, [cb]);
return (<div>.....<div>)