我发现了这个有趣的 React 行为,我想了解更多。
通常 React 会setState()
在事件处理程序中批处理多个调用,对吗?
但我测试了 React 在以下情况下不会批量调用:
事件处理函数是一个async
带有await
调用的函数。
和await
呼叫执行之前或之间的setState()
通话。
如果在调用await
之后运行setState()
,它们会像往常一样批处理。
问题:
你知道这背后的原因是什么吗?
CodeSandbox: https ://codesandbox.io/s/eventhandlerawaitso-jsdxs
这是mockAPI
电话
function mockAPI() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("I come from API using an AWAIT call");
},500);
});
}
这些是要测试的处理程序:
function handleClickNormal() {
console.clear();
console.log("Calling 1st setState()");
updateBooleanState(false);
console.log("Calling 2nd setState()");
updateBooleanState(true);
console.log("After 2nd setState()");
}
async function handleClickAwaitBefore() {
console.clear();
// AWAIT CALL RUNS BEFORE THE setState CALLS
const fromAPI = await mockAPI();
console.log(fromAPI);
console.log("Calling 1st setState()");
updateBooleanState(false);
console.log("Calling 2nd setState()");
updateBooleanState(true);
console.log("After 2nd setState()");
}
async function handleClickAwaitAfter() {
console.clear();
console.log("Calling 1st setState()");
updateBooleanState(false);
console.log("Calling 2nd setState()");
updateBooleanState(true);
console.log("After 2nd setState()");
// AWAIT CALL RUNS AFTER THE setState CALLS
const fromAPI = await mockAPI();
console.log(fromAPI);
}
async function handleClickAwaitBetween() {
console.clear();
console.log("Calling 1st setState()");
updateBooleanState(false);
// AWAIT CALL RUNS BETWEEN THE setState CALLS
const fromAPI = await mockAPI();
console.log(fromAPI);
console.log("Calling 2nd setState()");
updateBooleanState(true);
console.log("After 2nd setState()");
}
这是结果:
慕尼黑8549860
相关分类