面试题答案
一键面试避免频繁异步请求的优化方法
- 防抖(Debounce):
- 原理:设置一个定时器,在用户输入结束后的一定时间(例如300毫秒)内如果没有新的输入,才触发异步验证。如果在这个时间内又有新输入,则清除之前的定时器并重新设置。
- 示例代码(以JavaScript为例,使用lodash库):
import debounce from 'lodash/debounce'; const inputElement = document.getElementById('your - input - id'); const validateFunction = () => { // 异步验证逻辑,例如发送HTTP请求 console.log('Performing async validation...'); }; const debouncedValidate = debounce(validateFunction, 300); inputElement.addEventListener('input', debouncedValidate);
- 节流(Throttle):
- 原理:规定在一定时间间隔(例如500毫秒)内,无论用户输入多少次,只允许触发一次异步验证。
- 示例代码(以JavaScript为例,使用lodash库):
import throttle from 'lodash/throttle'; const inputElement = document.getElementById('your - input - id'); const validateFunction = () => { // 异步验证逻辑,例如发送HTTP请求 console.log('Performing async validation...'); }; const throttledValidate = throttle(validateFunction, 500); inputElement.addEventListener('input', throttledValidate);
处理异步验证器并行和串行执行问题
- 并行执行:
- 原理:使用
Promise.all
方法,将所有需要并行验证的异步任务放到一个数组中,Promise.all
会等待所有任务都完成(或者有一个任务失败)。 - 示例代码(以JavaScript为例):
const validateField1 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Field 1 valid'); }, 1000); }); }; const validateField2 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Field 2 valid'); }, 1500); }); }; Promise.all([validateField1(), validateField2()]) .then((results) => { console.log(results); // 包含两个验证结果的数组 }) .catch((error) => { console.error('Validation failed:', error); });
- 原理:使用
- 串行执行:
- 原理:通过链式调用
then
方法,前一个异步验证完成后再执行下一个。 - 示例代码(以JavaScript为例):
const validateField1 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Field 1 valid'); }, 1000); }); }; const validateField2 = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve('Field 2 valid'); }, 1500); }); }; validateField1() .then(() => validateField2()) .then((result) => { console.log(result); // Field 2 valid }) .catch((error) => { console.error('Validation failed:', error); });
- 原理:通过链式调用