一道题:实现一个promise防抖函数,如果多个fn同时调用,只希望执行最后一个,也就是只打印 3-->1
function takeLatest(fn) {
// 实现promise防抖
}
const fn = takeLatest(
(v) => new Promise(
(resolve) => {
setTimeout(() => { resolve(v); }, 1000);
}
)
);
fn(1).then((v) => { console.log("1--->", v); });
fn(1).then((v) => { console.log("2--->", v); });
setTimeout(() => {
fn(1)
.then((v) => {
console.log("3--->", v);
});
}, 200);
我的方法如下:
function takeLatest(fn) {
let timer;
return function () {
if (timer) {
clearInterval(timer)
}
const arg = arguments;
const context = this;
return new Promise((resolve) => {
timer = setTimeout(async () => {
resolve(await fn.call(context, ...arg))
},0)
})
}
}
但是结果不太行,打印结果是
2---> 1
3---> 1
请求解答:
- 为什么会打印2-->1
- 该方法如何实现呢
你的代码有几个问题