javascript - 处理从未调用过的回调?异步 JavaScript

标签 javascript asynchronous

我目前正在阅读“你不懂 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/

相关文章:

javascript - Zurb Foundation 下拉菜单不起作用

java - CompletableFuture.allOf 已完成,即使其列表中的一个 CompletableFuture 尚未完成

asynchronous - Angularjs bootstrap UI typeahead 无法异步工作

javascript - 带有异步调用的同步循环

javascript - 如何从异步调用返回响应?

javascript - 通过 JSON 订阅用户 - DISQUS API

javascript - 检查标题是否存在的更短方法

javascript - 查询 JavaScript 父子对象

javascript - 在 JavaScript 中将对象键设置为动态值

java - 如何在 Java 中实现异步方法调用?