pdd二面 自我复习版
// 原生js
// input输入框 onChange blur input
// 难处理的问题
// 框选 矩阵检测
// 防抖 节流 防止频繁调用
// 用数据计算的方式 防止卡顿
// 怎么做的矩阵检测 对角
// RAF
// async函数
// Function
async function fn(){
return 1234;
}
async function test(){
let result = await fn();
console.log(result);
}
//pending
let p = new Promise((resolve, reject)=>{
console.log(4);
// ...
if(Math.random()>0.5) resolve('success');
reject('failed');
})
console.log(1);
test();
console.log(2);
p.then(() => {
console.log(3);
})
/*
4
1
2
1234
3
*/
function requestPendingFunc(reqFn, timeout) {
// let res_map = new Map();
return function(){
if(reqFn.called) return reqFn.p;
reqFn.called = true;
let start = new Date.getTime();
const p = new Promise((resolve, reject)=>{
let done = false;
reqFn().then(data=>{
resolve(data)
done = true;
}, err=>{
// if((new Date.getTime() - start)/1000 > timeout) reject(err);
if(done) {
reject('over time!');
return;
}
reqFn().then(data=>{
resolve(data);
done = true;
},
err=>{
done = true;
reject(err)
}).finally(_=>done=true);
reject(err)
})
setTimeout(()=>{
if(done === false) done = !done; reject('over time!')
}, timeout)
})
reqFn.p = p;
return reqFn.p;
}
}
const fn1= requestPendingFunc(() => {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
const res = Math.random();
if(res>0.5) resolve(`success ${res}`);
reject('failed');
// ....异步逻辑 会消耗一定的时间
// ...
}, Math.random())
})
}, 5000);
(async function () {
fn1().then((res) => {
console.log(1, res);
})
fn1().then((res) => {
console.log(2, res);
})
fn1().then((res) => {
console.log(3, res);
})
const res = await fn1();
console.log(res);
})();
// 弹窗 屏幕垂直居中 如果要求你实现点击其他区域 关掉弹窗
全程项目问题+基础,面试官和我公用文本编辑器来交流。上面是面试结束时的编辑器内容。
- input的事件有哪些?
- 你的项目中有没有解决什么难以处理的问题?
- 矩阵相交如何检测?
- 节流、防抖?
- 了解过RAF吗?
- async函数和普通函数的区别?
- 写一个async函数(和它的调用)?
- 写一个promise的构造?
- promise和同步代码结合的输出?
- promise、同步代码、和async结合的输出?
- 完成一个函数requestPendingFunc,该函数可以传入两个参数:待执行的基本函数和时限。调用该函数返回一个新的函数(也就是下面代码的fn1),如果多次调用这个新的函数(fn1),只要其中一次的调用获得了结果,所有的调用获得同样结果。如果超时,返回失败结果('overtime')
- 在8的基础上,添加一个需求:允许失败后且未超时情况下,再尝试调用一次,其他规则一样。
- 如果有一个弹窗,如何实现点击弹窗外部后隐藏弹窗?
- 反问+聊天。
function requestPendingFunc(reqFn, timeout) {}
const fn1= requestPendingFunc(() => {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
const res = Math.random();
if(res>0.5) resolve(`success ${res}`);
reject('failed');
// ....异步逻辑 会消耗一定的时间
// ...
}, Math.random())
})
}, 5000);
(async function () {
fn1().then((res) => {
console.log(1, res);
})
fn1().then((res) => {
console.log(2, res);
})
fn1().then((res) => {
console.log(3, res);
})
const res = await fn1();
console.log(res);
})();
//res应该输出同样的值
