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

时间:2017-01-09 19:10:35

标签: javascript asynchronous

我目前正在阅读“你不知道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 ) );

2 个答案:

答案 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函数

这是此代码的基本流程。