我目前正在阅读“你不懂 Javascript”,并在如何解决从未运行的回调的示例中遇到了问题。
在下面列出的示例中,我不确定它是如何工作的。
所以底层代码首先检查是否有错误或者数据是否有效,然后使用 timeoutify(foo, 500) 调用 ajax 请求。
当timeoutify运行时,它使用foo和500作为参数,它运行第一个setTimeout函数,如果setTimeout没有被清除,在500毫秒内就会出现超时错误。
但是,从 if(intv) 部分开始,我在第二半部分遇到了麻烦。 timeoutify 是否总是将 if(intv) 设置为 true,因为 setTimeout 首先运行,因此该语句总是返回后半部分?什么时候会发生错误超时?
function timeoutify(fn,delay) {
var intv = setTimeout( function(){
intv = null;
fn( new Error( "Timeout!" ) );
}, delay );
return function() {
// timeout hasn't happened yet?
if (intv) {
clearTimeout( intv );
fn.apply( this, arguments );
}
};
}
这是前面的代码:
// using "error-first style" callback design
function foo(err,data) {
if (err) {
console.error( err );
} else {
console.log( data ); }
}
ajax( "http://some.url.1", timeoutify( foo, 500 ) );
最佳答案
我要指定的第一件事是 timeOutify 不会作为回调函数传递,如果它是回调,则应省略“(foo,500)”。所以我们实际上是用回调函数 foo 执行 timeOutify(foo, 500) ,500 将是等待时间值,当 timeOutify 执行时,它执行以下步骤: 1. 如果启动超时功能 2. 它返回一个带有 if block 的函数。
因此,如果ajax调用在超时之前成功,它将执行返回的函数,即
// timeout hasn't happened yet?
if (intv) {
clearTimeout( intv );
fn.apply( this, arguments );
}
};
intv 现在为 true,因为超时函数尚未执行,因此它将通过clearTimeout 停止超时发生,并使用 ajax 调用返回的数据上下文调用 foo 函数。
fn.apply( this, 参数 );//用于显式绑定(bind)。
另一种情况是,当 ajax 在给定的 500ms 时间内没有成功时,intv 设置为 null,这样代码后半部分的 if 检查就会失败,并且 foo 函数将以错误对象作为参数执行.
这是该代码的基本流程。
关于javascript - 处理从未调用过的回调?异步 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555201/