我目前正在阅读“你不知道Javascript'并在一个如何解决从未运行的回调的例子中遇到了一个问题。
在下面列出的示例中,我不确定它是如何工作的。
因此,底部代码首先检查是否存在错误,或者数据是否有效,然后使用timeoutify调用ajax请求(foo,500)。
当timeoutify正在运行时,它使用foo和500作为参数,它运行第一个setTimeout函数,如果setTimeout没有被清除,则在500毫秒内会发生超时错误。
但是,从if(intv)部分开始,我在第二部分遇到问题。没有时间总是得到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 ) );
答案 0 :(得分:1)
如果(intv)设置为true,因为setTimeout首先运行
没有。传递给intv
的函数将setTimeout
设置为true,并且在delay
指定的时间过去之前不会调用该函数。
答案 1 :(得分:0)
我要指定的第一件事是,如果timeOutify是回调,则不会将其作为回调函数传递,因此应省略“(foo,500)”。因此,我们实际上正在使用回调函数foo执行timeOutify(foo,500),并且500将是等待时间值,并且在执行timeOutify时,它执行以下步骤: 1.如果启动超时功能 2.它返回一个带有if块的函数。
因此,如果ajax调用在超时之前成功执行,它将执行返回的函数,即
// timeout hasn't happened yet?
if (intv) {
clearTimeout( intv );
fn.apply( this, arguments );
}
};
intv到目前为止是正确的,因为尚未执行超时功能,因此它将通过clearTimeout停止超时,并使用ajax调用返回的数据的上下文来调用foo函数。
fn.apply(this,arguments); //用于显式绑定。
在给定的500ms时间内ajax不成功的另一种情况是intv设置为null,以便代码后半部分的if检查失败,并且将以错误对象作为参数执行foo函数
这是此代码的基本流程。