【发布时间】:2020-02-06 18:54:40
【问题描述】:
假设有一个函数正在做一些复杂/长时间运行的事情:
const somethingMoreComplexSync = value => {
let stupidString = value;
for (let i = 0; i < 100000000; i++) {
stupidString = i % 2 === 0 ? stupidString + "1" : stupidString.slice(0, -1);
}
return stupidString;
};
(这个函数实际上只是返回作为参数传递的value)
现在假设您想在输入字段中键入内容后调用此函数:
const MyComponentSync = () => {
const handleChange = e => {
const complexValue = somethingMoreComplexSync(e.target.value);
console.log(complexValue);
};
return (
<label>
Sync
<input onChange={handleChange} />
</label>
);
};
所以每次输入一个字符onChange都会被触发,因此somethingMoreComplexSync也会被触发。
这里的问题是:使somethingMoreComplexSync异步有什么意义吗?
据我所知,事件无论如何都被称为异步? (这是真的吗?)
请参阅此codesandbox,其中还包含上述的异步实现。
【问题讨论】:
-
宁可使用 debounce 而不是触发多个更改。
-
@ysfaran 正如您所说,事件是异步调用的,因此使您的复杂函数异步不会为您节省任何时间,因为它是由另一个线程执行的。
-
@Jai 这只是一个例子。该事件也可能是
onBlur,因此在这种情况下,去抖动不会有帮助。 @robinvrd 不是 javascript 单线程吗?如果你看一下这个例子,无论你在哪里输入东西,它仍然会阻塞 UI。这也让我感到困惑。
标签: javascript reactjs asynchronous