解决从未调用的回调?异步Javascript

解决从未调用的回调?异步Javascript,javascript,asynchronous,Javascript,Asynchronous,我目前正在阅读“You't Know Javascript”,并在一个示例中遇到了一个问题,即如何解决从未运行过的回调 在下面列出的示例中,我不确定它是如何工作的 因此,底层代码首先检查是否存在错误或数据是否有效,然后使用timeoutify调用ajax请求(foo,500) 当timeoutify运行时,它使用foo和500作为参数,它运行第一个setTimeout函数,如果setTimeout未清除,500毫秒后将发生超时错误 然而,我在下半部分遇到了问题,从if(intv)部分开始。tim

我目前正在阅读“You't Know Javascript”,并在一个示例中遇到了一个问题,即如何解决从未运行过的回调

在下面列出的示例中,我不确定它是如何工作的

因此,底层代码首先检查是否存在错误或数据是否有效,然后使用timeoutify调用ajax请求(foo,500)

当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不总是将if(intv)设置为true,因为setTimeout首先运行


否。
intv
被传递到
setTimeout
的函数设置为true,并且该函数直到
delay
指定的时间过去后才会被调用。

我想指定的第一件事是,如果它是回调函数,而不是(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现在是真的,因为timeout函数到现在还没有执行,所以它将通过clearTimeout停止超时,并使用ajax调用返回的数据上下文调用foo函数

fn.apply(this,arguments);//用于显式绑定

另一种情况是,当ajax在给定的500毫秒内没有成功时,intv被设置为null,这样代码后面部分的if检查失败,foo函数将以error对象作为参数执行


这是这段代码的基本流程。

我仍然有点困惑。setTimeout中的函数一旦运行,就会将set intv变为true?我想它会在500秒后将intv=null设置为null。在这个队列中,返回的一半何时有机会激活?我想我不太确定的主要问题是这些事件正在发生。有人能再澄清一下吗?这是500毫秒而不是500毫秒。这是500毫秒,用于调用返回的函数。