主题
一个面试题
1. 面试题一
1.1. 面试题描述:
Please implement a function simplePoller that does the following: simplePoller function accepts two arguments: queryFn and callback queryFn is a function that returns true or false callback is a function that should be invoked when queryFn returns true simplePoller should invoke queryFn periodically When queryFn returns false, it waits for some time and invokes queryFn again until queryFn returns true The waiting interval between queryFn calls increases by 1.5 times each time, starting from 1 second When queryFn returns true, invokes callback and exit the function
For example: 1st time: wait for 1 second 2nd time: invoke queryFn and it returns false, wait for 1.5 second 3rd time: invoke queryFn and it returns false, wait for 2.25 second 4th time: invoke queryFn and it returns true, execute callback and exit
Make sure simplePoller passes the following test cases: simplePoller should wait for 1 second before it invokes queryFn the first time The waiting interval is 1.5 times of the previous one, except for the first (1 second) simplePoller should be allowed to be invoked concurrently and invocations of the function won't interfere with each other
Note: You don't have to implement queryFn and callback in your solution. You can assume they are given. However your implementation of simplePoller should be able to take different implementation of queryFn and callback without problem and to achieve that you are encouraged to implement a few versions of queryFn and callback for testing purposes.
请实现执行以下操作的函数simplePoller: SimplePaller函数接受两个参数:queryFn和callback queryFn是一个返回true或false的函数 callback是当queryFn返回true时应调用的函数 SimplePaller应该定期调用queryFn 当queryFn返回false时,它会等待一段时间并再次调用queryFn,直到queryFn返回true queryFn调用之间的等待间隔从1秒开始,每次增加1.5倍 当queryFn返回true时,调用回调并退出函数
例如: 第一次:等待1秒 第二次:调用queryFn并返回false,等待1.5秒 第三次:调用queryFn,返回false,等待2.25秒 第四次:调用queryFn并返回true,执行回调并退出 确保simplePoller通过以下测试用例:
SimplePaller在第一次调用queryFn之前应该等待1秒 除第一次(1秒)外,等待间隔是前一次的1.5倍 应该允许并发调用SimplePloter,并且函数的调用不会相互干扰 注意:您不必在解决方案中实现queryFn和callback。你可以假设它们是给定的。但是,您的SimplePaller实现应该能够毫无问题地实现queryFn和callback的不同实现,并且为了实现这一点,我们鼓励您实现几个版本的queryFn和callback以进行测试。
1.2. 答案:
js
function simplePoller(queryFn = function () {}, callback = function () {}) {
let waitTime;
// 执行实际任务
exeTask();
function exeTask() {
// 时间间隔以1.5倍递增
if (waitTime) waitTime = waitTime * 1.5; //第一次等待1秒
else waitTime = 1000; //1秒
// 开始执行业务逻辑
let res = queryFn();
if (res) {
callback();
} else {
setTimeout(() => {
exeTask(); //递归调用自身
}, waitTime);
}
}
}
simplePoller(); //执行1.3. 简单测试
js
function simplePoller(queryFn = function () {}, callback = function () {}) {
let waitTime;
// 执行实际任务
exeTask();
function exeTask() {
// 时间间隔以1.5倍递增
if (waitTime) waitTime = waitTime * 1.5; //第一次等待1秒
else waitTime = 1000; //1秒
// 开始执行业务逻辑
let res = queryFn();
// --------start------
console.log("waitTime====", waitTime);
if (waitTime == 3375) res = true;
else res = false;
// --------end -------
if (res) {
console.log("===callback执行===");
callback();
} else {
setTimeout(() => {
exeTask(); //递归调用自身
}, waitTime);
}
}
}
simplePoller();1.4. 效果

