实现JS延迟执行函数报TypeError [ERR_INVALID_CALLBACK]如何修复
问题原因
你代码的报错核心是setTimeout第一个参数接收的不是合法可执行函数:
你在调用setTimeout(callback(data), delay)时,直接执行了callback(data),拿到的是cb函数的返回值undefined,相当于给setTimeout传的第一个参数是undefined,自然触发ERR_INVALID_CALLBACK类型错误。
修复方案
有两种常用修复方式:
方案1:用匿名函数包裹回调调用
把需要执行的逻辑放到匿名函数里,等延迟结束后再执行:
let cb = function(x) { console.log(x); }; const doShortly = function(callback, delay, data) { // 把callback调用放到匿名函数里,延迟到setTimeout触发时再执行 let result = setTimeout(() => callback(data), delay); return result; }; console.log(doShortly(cb, 500, 'hi'));
方案2:使用setTimeout原生传参能力
setTimeout从第三个参数开始的所有值,都会作为入参自动传给第一个参数的回调函数,代码可以更简洁:
let cb = function(x) { console.log(x); }; const doShortly = function(callback, delay, data) { // 直接把data作为第三个参数传给setTimeout let result = setTimeout(callback, delay, data); return result; }; console.log(doShortly(cb, 500, 'hi'));
内容的提问来源于stack exchange,提问作者ras
相关产品推荐
相关产品推荐

